Rails 4 omniauth开发人员策略-回调错误-SessionsController#create中的ActionController :: InvalidAuthenticityToken

时间:2019-05-07 03:07:31

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

c9 ide,Ubuntu工作区,rails 4.2.10,ruby 2.4.0

当尝试在具有开发人员策略的开发人员模式下使用omniauth gem时,指向'auth/developer'的登录链接会成功向用户显示表单。提交表单后(路由为'auth/developer/callback'),将生成此错误:

ActionController::InvalidAuthenticityToken in SessionsController#create 

希望能够在其余应用程序开发期间使用开发人员策略。使用开发人员策略时(在开发模式下),文档似乎并未指定回调所需的其他任何内容。似乎在文档中至少存在一个小差异,这也是缺少的东西吗?

在使用实际提供程序时或在使用黄瓜的测试模式下,所有代码都可以正常工作。 这是我在config / initializers / omniauth.rb中开始的初始化器代码的一部分(不包括密钥/秘密):

OmniAuth.config.logger = Rails.logger
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :developer unless Rails.env.production?
  provider :github, 'redacted,'redacted',
         { :name => "github", :scope => ['read:user','user:email']}
  provider :facebook, 'redacted', 'redacted'  
end

宝石文件包括:

gem 'omniauth'
gem 'omniauth-github'
gem 'omniauth-facebook'

routes.rb:

match 'auth/:provider/callback', :to => 'sessions#create', :via => [:get, :post]

sessions_controller:

 def create
    begin
      authenticator = Authentication.new(env["omniauth.auth"])
      authenticator.disallow(session[:user_id]) if session?
      authenticator.deny if authenticator.missing_information?
      auth, message = authenticator.register_or_login
      session[:user_id] = auth.user.id
etc.

app / controllers / sessions_controller / authentication.rb:

  def initialize(omniauth)
      # get Omniauth authentication hash
      @auth_hash = omniauth
  end

  def auth_hash
      @auth_hash 
  end
etc.

成功(使用其他提供程序或在测试模式下)时,应为回调提供有效的令牌,然后可以轻松地通过sessions_controller的create方法将代码的路径跟踪到Authenticator类的构造函数等。

在使用开发人员策略的开发模式下,完全不会输入会话创建方法的主体。

获得有效令牌后,我应该看到诸如以下消息:

"Welcome <name> You've signed up via <provider>."

但是,由于在此之前引发了错误,因此只能在服务器输出中看到以下内容:

Processing by SessionsController#create as HTML
  Parameters: {"name"=>"Example User", "email"=>"example@user.com", "provider"=>"developer"}
Can't verify CSRF token authenticity
Completed 422 Unprocessable Entity in 1ms (ActiveRecord: 0.0ms)

ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):
  actionpack (4.2.10) lib/action_controller/metal/request_forgery_protection.rb:181:in `handle_unverified_request'

1 个答案:

答案 0 :(得分:1)

我在Wiki的另一部分中找到了这一点: 回调开发人员策略后会破坏Rails会话 开发人员策略回调使用POST请求发送。对于给定的操作,请禁用伪造保护,否则会话将被Rails破坏。

skip_before_action:verify_authenticity_token,仅::create

这绝对可以,但是我还有几个问题。 是不是由omniauth本身定义和处理了before_action,还是在非开发人员模式下将其添加到控制器中?
通过在开发人员模式下添加该行,并在生产环境中删除该行,似乎该方案可以工作,这似乎非常不可靠。有没有办法自动执行它?