首页 > 解决方案 > 从控制器发出 POST 请求时,Rails Oauth 请求阶段未能通过 CSRF 验证

问题描述

我正在尝试通过 rails 控制器向 Micrsoft Graph API 发出身份验证请求。我不使用 rails erb 模板,因此不包括<%= csrf_meta_tags %>自动生成所需的 CSRF 元标记。

相反,我直接从 ApplicationController 发出 POST 请求。根据为 rails/ms-graphs 集成提供的示例项目(https://github.com/microsoftgraph/msgraph-training-rubyrailsapp) ,我正在使用omniauth-oauth2和gems。其余配置按照示例。omniauth-rails_csrf_protection

在我的控制器中,我尝试使用以下内容发出 oauth 请求:

response = Faraday.post('http://localhost:3000/omniauth/microsoft_graph_auth') do |req|
          req.headers['Content-Type'] = 'application/x-www-form-urlencoded'
          req.headers['X-CSRF-Token'] = form_authenticity_token
end

其中form_authenticity_tokenRequestForgeryProtection 模块中的方法自动在会话中设置原始令牌并返回加密令牌以用于 html 元或在X-CSRF-Token我的情况下的请求标头中使用。

尽管我尽了最大的努力和辛勤工作了好几天,但我总是会InvalidAuthenticityToken出错。omn​​iauth 中间件拦截请求并失败并显示以下内容:

Started POST "/omniauth/microsoft_graph_auth" for ::1 at 2021-08-03 22:34:26 +0100
D, [2021-08-03T22:34:26.859167 #76841] DEBUG -- omniauth: (microsoft_graph_auth) Request phase initiated.
E, [2021-08-03T22:34:26.860607 #76841] ERROR -- omniauth: (microsoft_graph_auth) Authentication failure! ActionController::InvalidAuthenticityToken: ActionController::InvalidAuthenticityToken, ActionController::InvalidAuthenticityToken

ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):

omniauth-rails_csrf_protection (1.0.0) lib/omniauth/rails_csrf_protection/token_verifier.rb:34:in `call'
omniauth (2.0.4) lib/omniauth/strategy.rb:240:in `request_call'
omniauth (2.0.4) lib/omniauth/strategy.rb:193:in `call!'
omniauth (2.0.4) lib/omniauth/strategy.rb:169:in `call'
omniauth (2.0.4) lib/omniauth/builder.rb:45:in `call'
rack-cors (1.1.1) lib/rack/cors.rb:100:in `call'
...

我尝试了一系列请求变体,不同的“Content-Type”值,在请求正文中设置 CSRF 令牌,但无济于事。我的请求中是否缺少一些基本内容?或者也许有一些我对 CSRF 验证机制不了解的更基本的东西,form_authenticity_token根本不能以这种方式使用。如果是这样,我如何将正确的 CSRF 令牌元从 rails 应用程序插入到 javascript 前端?非常感谢任何帮助或指导。

标签: ruby-on-railsoauth-2.0csrfomniauth

解决方案


推荐阅读