ruby-on-rails - session 在 OmniAuth 和 Rails 4 重定向中不持久

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

我在使用 OmniAuth 时遇到问题在 Rails 4.0.0.beta1 中,SessionsController 中设置的 session 值不会通过重定向持久化。我试图弄清楚它是否是我的代码中的某些内容、Rails 4 中的错误,或者与 OmniAuth gem 不兼容。我正在使用 OmniAuth 开发人员策略。

我不确定这是否意味着什么,但是如果我将调试器放入 SessionsController#createsession[:user_id] = user.id行并检查 session 对象的类,我得到:

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

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

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

session 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

配置/初始化程序/secret_token.rb
MyApp::Application.config.secret_key_base = 'REMOVED'

配置/初始化程序/session_store.rb
MyApp::Application.config.session_store :encrypted_cookie_store, key: '_my_app_session'

最佳答案

事实证明,这与 Rails 4 和使用 omniauth gem 开发人员策略之间的问题有关。我修复了 https://github.com/intridea/omniauth/pull/674

更新

由于 PR 没有合并,我想我会发布一个似乎对大多数人都有效的简单解决方案。问题是开发人员策略不包括 Rails 默认需要的表单真实性 token 。您可以使用以下命令在 session Controller 中禁用此功能:

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

关于ruby-on-rails - session 在 OmniAuth 和 Rails 4 重定向中不持久,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15351985/

相关文章:

ruby-on-rails - 在 Windows Server 上托管 Ruby 应用程序是否可行?

ruby-on-rails - 在 Rails 中使背景宽度为 100%

javascript - AJAX 中的 session 超时响应

php - 将带有回调的 session 从 php4 迁移到 php5 的奇怪行为

ruby-on-rails - Rails Devise-omniauth 路线指向 passthru 而不是 twitter

ruby-on-rails - 使用 has_secure_password 和 oauth(比如 facebook)认证

javascript - Rails webpack js和ajax刷新

ruby-on-rails - 将 paypal 定期 gem 用于永久有效的计划时要设置什么频率

c - 如何像在 PHP 中一样使用 c 处理 CGI 中的 session

ruby-on-rails-3 - #_=_ 由 facebook 添加到 URL