ruby-on-rails - 从控制器发出 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_token
RequestForgeryProtection 模块中的方法自动在会话中设置原始令牌并返回加密令牌以用于 html 元或在X-CSRF-Token
我的情况下的请求标头中使用。
尽管我尽了最大的努力和辛勤工作了好几天,但我总是会InvalidAuthenticityToken
出错。omniauth 中间件拦截请求并失败并显示以下内容:
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 前端?非常感谢任何帮助或指导。
解决方案
推荐阅读
- mysql - 这是一个多对多关系模型的问题
- assimp - 使用 AssImp 在 UDIM 的基础上分割网格
- sql - 创建一个接受数据时间列表作为参数的存储过程
- java - 不推荐使用 activeNetworkInfo 的 Getter,在 Java 中不推荐使用
- javascript - 丹·阿布拉莫夫的主题变化逻辑
- firebase - 仅更新列表中点击的 ListTile 颜色
- regex - 标签之间的正则表达式匹配模式插入特定字符串
- python - 如何在 Python 的 csv 文件中对一行中的所有数字求和?
- git - 如何从提交历史记录中删除 github 中的图像
- reactjs - 如何从样式组件中的道具测试样式?