【问题标题】:Session Not Persisting Across Redirect With OmniAuth and Rails 4使用 OmniAuth 和 Rails 4 重定向时会话不持久
【发布时间】:2013-03-12 01:58:24
【问题描述】:

我在将 OmniAuth 与 Rails 4.0.0.beta1 一起使用时遇到问题,其中在 SessionsController 中设置的会话值不会在重定向中保持不变。我试图弄清楚它是否是我的代码中的某些东西,Rails 4 中的错误,或者与 OmniAuth gem 不兼容。我正在使用 OmniAuth 开发者策略。

我不确定这是否意味着什么,但是如果我在session[:user_id] = user.id 行之后的SessionsController#create 中放置一个调试器并检查会话对象的类,我会得到:

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

但是,如果我在运行 Rails 3.2 的不同应用程序中检查同一个会话类,我会得到:

Hash

也许 OmniAuth 无法正确处理 NullSessionHash 对象?

sessions_controller

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'

【问题讨论】:

    标签: ruby-on-rails session omniauth ruby-on-rails-4


    【解决方案1】:

    事实证明,这与 Rails 4 和使用omniauth gem 开发者策略之间的问题有关。我把它固定在https://github.com/intridea/omniauth/pull/674

    更新

    由于 PR 没有合并,我想我会发布一个似乎适用于大多数人的简单解决方案。问题是开发者策略不包含 Rails 默认需要的表单真实性令牌。您可以在会话控制器中使用以下命令禁用此功能:

    class SessionsController < ApplicationController
      skip_before_filter :verify_authenticity_token
      # ...
    end
    

    【讨论】:

      猜你喜欢
      • 2018-09-03
      • 2016-03-10
      • 1970-01-01
      • 2022-11-10
      • 2014-08-17
      • 2016-04-10
      • 2015-08-16
      • 2011-07-05
      • 2014-06-09
      相关资源
      最近更新 更多