7

Rails 4.0.0.beta1 でOmniAuthを使用すると、SessionsController で設定されたセッション値がリダイレクトで保持されないという問題が発生します。コードに問題があるのか​​、Rails 4 のバグなのか、OmniAuth gem との非互換性なのかを突き止めようとしています。OmniAuth 開発者戦略を使用しています。

これが何かを意味するかどうかはわかりませんがSessionsController#create、行の後にデバッガーを配置しsession[:user_id] = user.idてセッション オブジェクトのクラスを調べると、次のようになります。

ActionController::RequestForgeryProtection::ProtectionMethods::NullSession::NullSessionHash

ただし、Rails 3.2 を実行している別のアプリケーションで同じセッション クラスを調べると、次のようになります。

Hash

OmniAuth が NullSessionHash オブジェクトを適切に処理できないのではないでしょうか?

セッションコントローラー

class SessionsController < ApplicationController
  skip_before_filter :authenticate_user!

  def create
    user = User.find_or_create_by_auth_hash(auth_hash)
    session[:user_id] = user.id
    redirect_to root_path
  end

  protected

  def auth_hash
    request.env['omniauth.auth']
  end

end

config/initializers/secret_token.rb

MyApp::Application.config.secret_key_base = 'REMOVED'

config/initializers/session_store.rb

MyApp::Application.config.session_store :encrypted_cookie_store, key: '_my_app_session'
4

1 に答える 1

5

これは、Rails 4 と omniauth gem 開発者戦略の使用との間の問題に関連していることが判明しました。https://github.com/intridea/omniauth/pull/674で修正しました

アップデート

PR がマージされなかったので、ほとんどの人に役立つと思われる簡単な解決策を投稿することにしました。問題は、Rails がデフォルトで必要とするフォーム認証トークンが開発者戦略に含まれていないことです。セッションコントローラーでこれを無効にするには、次のようにします。

class SessionsController < ApplicationController
  skip_before_filter :verify_authenticity_token
  # ...
end
于 2013-03-27T03:30:32.260 に答える