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'
答案 0 :(得分:1)
我在Wiki的另一部分中找到了这一点: 回调开发人员策略后会破坏Rails会话 开发人员策略回调使用POST请求发送。对于给定的操作,请禁用伪造保护,否则会话将被Rails破坏。
skip_before_action:verify_authenticity_token,仅::create
这绝对可以,但是我还有几个问题。
是不是由omniauth本身定义和处理了before_action,还是在非开发人员模式下将其添加到控制器中?
通过在开发人员模式下添加该行,并在生产环境中删除该行,似乎该方案可以工作,这似乎非常不可靠。有没有办法自动执行它?