You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用:null_session仍报错?Rails API跨域及CSRF令牌问题求助

问题解决指南

一、Origin 头不匹配问题

这个错误属于跨域请求校验失败。Rails 默认会验证请求的 Origin 头与应用的 base_url 是否一致,你的前端跑在 http://localhost:3020,后端在 http://localhost:3000,跨域导致触发了这个校验。

解决步骤:

  • 打开 config/initializers/cors.rb,配置允许跨域的源:
Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins 'http://localhost:3020' # 替换成你的前端实际地址
    resource '*',
      headers: :any,
      methods: [:get, :post, :put, :patch, :delete, :options, :head],
      credentials: true # 必须开启,否则跨域无法传递 Cookie
  end
end
  • 重启 Rails 服务器使配置生效。

二、CSRF 令牌无效问题

你的代码存在三处关键问题:

1. 令牌生成与验证的上下文不统一

CsrfTokenController 继承自 ApplicationController,而 ApiController 继承自 ActionController::API,两者的 Session 存储上下文不同。form_authenticity_token 是基于当前 Session 生成的,上下文不统一会导致验证时无法匹配。

修正:让令牌生成控制器继承自 ApiController:

class CsrfTokenController < ApiController
  skip_before_action :verify_authenticity_token

  def index
    render json: { csrf_token: form_authenticity_token }
  end
end

2. 自定义验证方法调用错误

你调用 valid_authenticity_token?(token, nil) 的参数不正确,该方法第一个参数应为 Session 对象,第二个是令牌值。正确写法:

private

def validate_csrf_token
  return true unless request.post?
  token = request.headers['X-CSRF-Token']
  if token.blank? || !valid_authenticity_token?(session, token)
    render json: { error: 'Invalid CSRF token' }, status: :unprocessable_entity
  end
end

3. 对 :null_session 的误解

protect_from_forgery with: :null_session 的作用是当 CSRF 验证失败时,用空 Session 替换当前 Session,而非跳过验证。你同时添加了自定义的 validate_csrf_token 前置动作,相当于做了两次验证,逻辑冗余且容易冲突。

优化建议:如果不需要自定义验证逻辑,直接去掉自定义的前置动作,依赖 Rails 默认验证即可:

class ApiController < ActionController::API
  protect_from_forgery with: :null_session, only: %i[execute]
  # 移除 before_action :validate_csrf_token
end

同时,前端请求必须开启 withCredentials: true(比如 Axios 配置),确保 Cookie 能跨域传递——因为 CSRF 令牌是和 Session 绑定的,没有 Cookie 就无法完成验证。

最终验证步骤

  1. 确认 CORS 配置正确并重启服务器;
  2. 确保令牌生成与验证用的是同一控制器父类;
  3. 前端请求携带 X-CSRF-Token 头,且开启 withCredentials;
  4. 测试 POST 请求,验证令牌有效性。

内容的提问来源于stack exchange,提问作者Rogelio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 01:29:57