NextJS用axios请求时Rails未在响应头返回Authorization token但Postman正常
问题原因及解决方案
核心问题是浏览器跨域资源共享(CORS)规范的限制:默认只允许前端访问6种基础响应头,自定义头Authorization必须后端主动配置暴露才允许前端读取,Postman不受CORS规则限制,所以可以正常拿到头信息。
你需要逐一检查以下配置:
1. 修复Rails CORS配置
你大概率使用了rack-cors gem处理跨域,找到config/initializers/cors.rb文件,在资源配置中添加expose规则:
Rails.application.config.middleware.insert_before 0, Rack::Cors do allow do origins 'http://localhost:3000' # 替换为你的NextJS前端实际域名,生产环境禁止用通配符* resource '*', headers: :any, methods: [:get, :post, :put, :patch, :delete, :options, :head], expose: ['Authorization'], # 必须添加此行,暴露Authorization头给前端 credentials: true # 如果请求需要携带Cookie则添加此配置 end end
修改完成后重启Rails服务生效。
2. 调整axios请求配置
如果后端开启了credentials规则,axios需要同步开启跨域带凭证配置:
// 全局配置 axios.defaults.withCredentials = true // 单请求配置示例 axios.post('/api/login', loginParams, { withCredentials: true }).then(res => { // 注意axios返回的响应头key为小写,不要用大写Authorization取值 const token = res.headers.authorization localStorage.setItem('token', token) })
3. 校验Devise-JWT配置
打开config/initializers/devise.rb确认JWT配置没有异常:
- 确保
config.jwt_header = 'Authorization'为默认配置,没有被修改为其他自定义头名 - 确认你配置的JWT失效策略不会在登录请求完成后立即清空生成的token
4. 排查代理过滤问题
如果你在NextJS中配置了接口反向代理,检查next.config.js的代理规则,确认没有过滤掉Authorization响应头。
内容的提问来源于stack exchange,提问作者JeffreyP7
相关产品推荐
相关产品推荐

