アプリなどを開発するブログ

React Native / Swift / Ruby on Railsなどの学習メモ。


Deviseでサインイン後に新しいsession idを取得する

deviseのcontrollerでログイン処理を書く時、

sign_in(user)

しても、sessionのidは更新されません。
actionの処理を抜けると初めて更新されます。

調べてるとこれが出てきました。
stackoverflow.com

で、この記事が参照してるのがこちら。
stackoverflow.com

2つの記事をまとめるとこんな感じ

class SessionsController < Devise::SessionsController
  def create
    self.resource = warden.authenticate!
    sign_in(resource_name, resource)
    commit_session_now!
    render json: { session_id: session.id }
  end

  private

  def commit_session_now!
    return unless request.session_options[:renew]

    session_data = session.to_hash.delete_if { |_k, v| v.nil? }
    session_store.send(:set_session, env, session_id, session_data, request.session_options)

    request.session_options[:renew] = false
    request.session_options[:id] = session_id
  end

  def session_store
    @session_store ||= request.session_options.instance_variable_get('@by')
  end

  def env
    @env ||= request.session_options.instance_variable_get('@env')
  end

  def session_id
    @session_id ||= session_store.send(:destroy_session, env, session.id || session_store.generate_sid, request.session_options)
  end
end

採用すべきでないやり方ですが、こんなのもありました。
319ring.net

おまけ

Railsガイドのセキュリティ対策に関するページ。
読み応えありますね。 Railsのセキュリティ | Rails日本語ドキュメント | Ruby STUDIO