deviseが作成したsessionはどれだ?
devise/lib/devise/controllers/helpers.rb
https://github.com/plataformatec/devise/blob/40f02ae69baf7e9b0449aaab2aba0d0e166f77a3/lib/devise/controllers/helpers.rb
def #{mapping}_session
current_#{mapping} && warden.session(:#{mapping})
end
helpers.rb
の123行目には
#{mapping}_sessionとすればそのセッションを見ることができる
ということが書いてある。
(mappingは今はuserと考えておけば良い)
user_session
を入力すると、
[16] pry(#<TopController>)> user_session
=> {"last_request_at"=>1553329704}
が返ってくる。
ちなみに先ほどのメソッドの内容から、warden.session(:user)
としても同様。
[15] pry(#<TopController>)> warden.session
=> {"last_request_at"=>1553329704}
また、 session.keys
と入力すると
[18] pry(#<TopController>)> session.keys
=> ["session_id", "flash", "warden.user.user.key", "warden.user.user.session"]
と返ってくるが、 session["warden.user.user.session"]
としても同様に同じセッションが帰ってくる。
[19] pry(#<TopController>)> session["warden.user.user.session"]
=> {"last_request_at"=>1553329704}
てなると気になるのは、
このsessionのHashはどこで設定されているのか?
という点。
まずは warden
に session
というメソッドらしきものがあるかを確認する。
warden/lib/warden/proxy.rb
https://github.com/wardencommunity/warden/blob/b7ff0f4ffacd7ad5a9b5a0191f1da0c7a64b2c2c/lib/warden/proxy.rb
def session(scope = @config.default_scope)
raise NotAuthenticated, "#{scope.inspect} user is not logged in" unless authenticated?(scope)
raw_session["warden.user.#{scope}.session"] ||= {}
end
warden/proxy.rb
の244行目にsessionメソッドがあった。
ここには先ほど3番目に確認した "warden.user.user.session"という名前の命名についてのルールが書かれてある。
sessionのHashのルールについては書かれていないが、これもこれで勉強になる。
では肝心のHashについてはというと、
devise/lib/devise/hooks/timeoutable.rb
https://github.com/plataformatec/devise/blob/master/lib/devise/hooks/timeoutable.rb
unless env['devise.skip_trackable']
warden.session(scope)['last_request_at'] = Time.now.utc.to_i
end
timeoutable.rb
の31行目に答えが書いてあった。
Hashのkeyである last_request_at
は、手入力で決められたもので、
valueは UTCでの現在時刻
という変数だった。
お勉強になりました