motolog

Everything I love in my life.

Railsでサブドメイン間でログインを保持するためのセッション設定

Railsでサブドメインにアクセスすると、デフォルトの設定では、ログイン(セッション)が保持されません。

解決策は以下の通りです。
ググると間違った(or 古い)情報も散乱していたので、惑わされないようにそちらも一応のせておきます。

session_store.rbの設定

session_store.rb で以下のように設定します。




# session_store.rb
Appname::Application.config.session_store :cookie_store, key: '_user_session', domain: 'example.com'

少し解説すると、

domain: 'example.com'

のように、domainを指定するのがポイント。
production, staging, development で以下のように分岐してあげればいいかなと。

if Rails.env.production?
Appname::Application.config.session_store :cookie_store, key: '_user_session', domain: 'example.com'
elsif Rails.env.staging?
Appname::Application.config.session_store :cookie_store, key: '_user_session', domain: 'staging-example.com'
else
Appname::Application.config.session_store :cookie_store, key: '_user_session', domain: 'lvh.me'
end

ちなみに、stagingで用いている 'lvh.me' は、127.0.0.0 に割り当てらているドメインです。localhost だとサブドメインのチェックはできないので、lvh.me はすごく便利。

domainオプションを追記する際には、keyも変えるべし

ここはハマったところなのですが、domain: 'example.com' を追加すると、セッションの情報も変わります。しかし、keyの名前は同じ。

すると、既にログインしていたユーザーがログアウトできなくなるなどの不都合が生じてしまう可能性があります。(実装にも依ると思いますが)

なので、domainオプションを追加するタイミングで、session_key の名前も変更しておいたほうが無難だなーと思います。

関連記事



© 2018 Motoki Yoshida