31943


この投稿は下記ページの転載です。  
<https://teratail.com/questions/61778>

* * *

Rails3で稼働しているアプリケーションをRails5にアップデートしようと思っています。

Rails5のプロジェクトを新規作成し、現状のアプリケーションと同じサーバー内で２つを並行稼動させ、Nginx側でURLによるルーティングをすることで徐々に5へ移行していくような計画をたてています。

静的なページはこれでうまく動いているのですが、ログインが必要なページでセッションが共有されず困っています。

Rails3とRails4以降ではセッション暗号化の仕組みが変わっているようなので、下記の記事を参考に設定を行いました。

<https://medium.com/ruby-on-rails/3-steps-to-share-a-session-between-
rails-3-and-rails-4-applications-9618766e6c2a#.udvo3a58p>

1\. 新旧Railsでセッションストアの設定を統一

[code]

    # config/initializers/session_store.rb
    Rails.application.config.session_store :cookie_store, key: 'example.net_session'
    
[/code]

2\. Rails5のcookie形式をjsonからmarshalに変更

[code]

    Rails.application.config.action_dispatch.cookies_serializer = :marshal # default: :json
    
[/code]

3\. Rails5のsecret_key_baseの設定を消し、代わりにsecret_tokenを設定

secret_tokenはRails3のconfig.secret_token と同じ値です

[code]

    development:
      # secret_key_base: abc123...
      secret_token: 123abc...
    
[/code]

4\. Deviseのsecret_keyを設定

これも新旧Railsで共通の値を入れています

[code]

    Devise.setup do |config| 
      config.secret_key = "xyz123"
      ~~~
    end
    
[/code]

設定は以上です。

ローカルで2つのRails(WEBrickとPuma)をdocker内で立ち上げ、本番と同じようにNginxでURLによってproxy_passを振り分けるという方法でテストしています。

Rails3側でログインし、次にRails5側で実装済みのページに移動するとcookieが書き換えられてしまい、非ログイン状態に戻ってしまいます。

他に試すべきこと、確認事項などあれば些細な事でも結構ですので、助言を頂けると幸いです。よろしくお願いします。


CC BY-SA 3.0
2017-01-15T07:18:07.410
31867
2017-01-18T09:08:33.453
2017-01-15T18:38:56.950
76
20230
question
ruby-on-rails devise cookie session
２つのRailsアプリケーション間でセッションを共有したい


自己解決しました。

セッションが共有できなかった原因は、Rails3の方でdevise-encryptableを導入していたからでした。解決方法は下記になります。

Rails5のGemfileに`devise-encryptable`を追加し`bundle install`

Rails5の`app/models/user.rb`のdeviseオプションに`:encryptable`を追加

[code]

    class User < ApplicationRecord
      devise :database_authenticatable, :registerable,
        :recoverable, :rememberable, :trackable, :validatable, :encryptable
    end
    
[/code]

Rails5の`config/initializers/devise.rb`に、Rails3の方と同じ暗号化方式を設定

[code]

    Devise.setup do |config|
      config.encryptor = :sha512
    
[/code]

以上で、２つのアプリケーション間でログイン状態を共有できるようになりました。


CC BY-SA 3.0
2017-01-18T09:08:33.453
31943
2017-01-18T09:08:33.453
20230
31867
answer