BETA

Rails Tutorialやってみた!21(9章-2)

投稿日:2019-03-27
最終更新:2019-03-27

100DaysOfCode 23/100

ログイン状態の保持

  • 半永続的なcookiesを作る際に、有効期限20年のものがよく使われる
cookies[:remember_token] = { value:   remember_token,  
                             expires: 20.years.from_now.utc }  

このように書くこともできますが、

cookies.permanent[:remember_token] = remember_token  

よくある設定なので、これだけで「有効期限20年」の設定にできるようになっています。

cookiesにはトークンだけでなく、ユーザーが誰なのかを判別するためのユーザーIDも必要です。
トークンとセットで扱うために、こちらも20年設定にします。

cookies.permanent.signed[:user_id] = user.id  

signed は署名付きcookiesを使用することを示します。

トークンと記憶ダイジェストの比較

BCrypt::Password.new(remember_digest) == remember_token  

一見このコードはおかしいです。
左辺は暗号化されているのに、右辺のremember_tokenは生のデータのはず……

ですが、実はbcrypt gemは==演算子の再定義を行っているので、元々の==とは異なります。
実体はこのようなコードになります。

BCrypt::Password.new(remember_digest).is_password?(remember_token)  

is_password?とは

ここでis_password? というメソッドが具体的に何をしているのかがよくわからなかったのですが、
remember_tokenremember_digest をうまいこと照合してくれるメソッドということでしょうか。

authenticate?メソッド

def authenticated?(remember_token)  
  BCrypt::Password.new(remember_digest).is_password?(remember_token)  
end  

このauthenticated?メソッドは、引数として受け取ったremember_tokenattr_accessorで定義したものではなく、ローカル変数)をremember_digest(こちらはUsersカラムの属性)と照合して真偽値を返すメソッドです。

終わりに

正直に言って本文だけでは理解しきれていないので、逐一検索しながら進んでいます。

https://www.slideshare.net/yasulab/rails-9-68247055

こちらのスライドが今やっていることを理解する助けになりました。

  • DB上に記憶トークンのダイジェストをユーザー毎に保存
  • ブラウザ側にはユーザーIDと記憶トークンをcookiesとして保存
  • cookiesのユーザーIDからユーザーを検索
  • 検索結果のユーザーが持っている記憶トークンのダイジェストを、cookiesの記憶トークンと照合して認証

という理解です。大丈夫かな。
とても重要な章なので、食らいついていきます!

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@tammcの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!