質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

1186閲覧

railsチュートリアル の11章に「new_tokenがユーザーIDと同じ役割を果たす」について

nnmnnm

総合スコア10

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2019/07/15 12:16

railsチュートリアル の11章に「new_tokenがユーザーIDと同じ役割を果たします」とありますが、一体どのような仕組みなのでしょうか。

また、idを直接挿入しない理由はセキュリティ上の問題と考えているのですが、その理解で大丈夫でしょうか?

http://www.example.com/account_activations/q5lt38hQDc_959PVoo6b7A/edit

上のURLの「q5lt38hQDc_959PVoo6b7A」という部分はnew_tokenメソッドで生成されたものです (リスト 9.2)。URLで使えるようにBase64でエンコードされています。これはちょうど/users/1/editの「1」のようなユーザーIDと同じ役割を果たします。このトークンは、特にAccountActivationsコントローラのeditアクションではparamsハッシュでparams[:id]として参照できます。

railsチュートリアル 11章
https://railstutorial.jp/chapters/account_activation?version=5.0#sec-account_activations_controller

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

内部的にはIDというよりもパスワードとして利用しています。

クエリパラメータを使って、このURLにメールアドレスもうまく組み込んでみましょう。
account_activations/q5lt38hQDc_959PVoo6b7A/edit?email=foo%40example.com

となっているように、アカウントの識別にはパラメータemailを使っており、tokenは認証のためのパスワードです。

投稿2019/07/15 21:26

編集2019/07/15 21:27
asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nnmnnm

2019/07/16 12:51 編集

回答ありがとうございます。少し開けたような気がしています。 クエリパラメータとして渡されたemailアドレスでユーザーを検索し、その後、URLに含まれたトークンの部分をDBに保存されたハッシュ化されたトークンと比較し、一致すればユーザーの有効化が完了するという流れは何となく見えた気がします。 「アカウントの識別にはパラメータemailを使っており、tokenは認証のためのパスワードです」とのことですが、emailアドレスにuniqueになるようにvalidationされているので、それが一意のユーザーを示すものとして、ユーザーIDと同等の働きができるという認識で大丈夫ですか? しかし、そうなると、トークンとメールアドレスの両方をクエリパラメータに含めるという方法もできそうなのですが、URLに含めてしまうことには何か理由があるのでしょうか?
asm

2019/07/16 09:30

そもそも、通常のログインの場合でもメールアドレスによってログインユーザを特定しています。 なので、この開発中のサイトではメールアドレスがユーザーIDを識別する際に使うもの、ということでしょう。 > URLに含めてしまうことには何か理由が チュートリアルという性質上、色々なことを実演したかったのでは?
nnmnnm

2019/07/16 12:56 編集

たくさんの質問を丁寧に回答いただきありがとうございました! 助けていただいたおかげで、7割くらいの理解にすることができた気がしています!
guest

0

new_tokenがユーザーIDと同じ役割を果たします

new_tokenがあれば(これから作る確認手順を経由して)当該ユーザーとしてログインができる」という意味です。

idを直接挿入しない理由はセキュリティ上の問題と考えているのですが、その理解で大丈夫でしょうか?

はい、予測可能なIDでは容易に突破可能となってしまいます。

投稿2019/07/15 13:47

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nnmnnm

2019/07/15 14:16

回答ありがとうございます。new_tokenを代わりにユーザーIDとして利用できるということは理解しています。ただ、new_tokenという独自に定義したメソッド(アクション)を用いて生成されたトークンをIDの代わりに活用できることが不思議で、どのような処理をされているかを知りたいです。 new_token の内部にある SecureRandom.base64を使って生成されたオブジェクトは、IDとして利用可能ということですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問