【问题标题】:InvalidAuthenticityToken for rails api only application for post request仅用于发布请求的 Rails api 应用程序的 InvalidAuthenticityToken
【发布时间】:2020-02-22 22:13:17
【问题描述】:

我正在使用仅限 api 的应用程序,并且在发布请求时不断收到错误。发布请求来自前端应用程序,我也在用邮递员测试样本数据。

这是我每次尝试提交请求时都会遇到的错误

HTTP Origin header (http://localhost:3000) didn't match request.base_url (http://localhost:4000)
Completed 422 Unprocessable Entity in 1ms (ActiveRecord: 0.0ms | Allocations: 238)

我设置了 rack-cors gem 并且原点指向 localhost:3000。

Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins 'http://localhost:3000'

    resource '*',
      headers: :any,
      credentials: true,
      methods: [:get, :post, :put, :patch, :delete, :options, :head]
  end
end

【问题讨论】:

  • 测试服务器运行在4000端口,避免与开发服务器冲突。为两个端口添加条目或使用基于Rails.env 的条件。
  • 将您的origins 'http://localhost:3000' 更改为来源http://localhost:4000
  • @MUHAMMADSOBAN 太好了,现在他破坏了开发服务器......
  • 当然,我说的是本地环境,而对于dev则要使用不同的origin

标签: ruby-on-rails ruby cors


【解决方案1】:

您可以添加多个允许的来源:

origins 'localhost:3000', 'localhost:4000'

你也可以使用正则表达式:

origins /\Ahttps?:\/\/localhost:\d{1,}$/

完全可能的更好解决方案是避免对域进行硬编码并使用 ENV vars。

但是 ActionController::InvalidAuthenticityToken 实际上是由 Rails CSRF 保护引发的,与 CORS 无关。它是针对“经典应用”的基于会话的 CSRF 保护方案,您可以通过删除中间件(首选)或 skip_before_action :verify_authenticity_token 在 API 中删除它。

【讨论】:

  • 完美,现在 skip_before_action 被认为是危险的?考虑到 Rails 在 POST、PUT、PATCH 请求服务期间没有检查authentity_token?有什么需要注意的吗?
  • 它是否比许多其他没有内置 anti-csrf 的框架更危险?没有。
【解决方案2】:

你应该改变你的基本控制器 喜欢:

class Api::V1::BaseController < ApplicationController

class Api::V1::BaseController < ActionController::API

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-17
    • 2017-04-12
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多