跨域请求携带 Authorization 头为什么返回 401 未授权错误怎么解决

文章导读
跨域请求携带 Authorization 头返回 401 错误,通常是因为凭证格式不正确、Token 已过期,或跨域配置未允许携带凭证。优先检查 Authorization 头是否遵循 Bearer 空格 Token 格式,再确认后端 CORS 是否设置 credentials:true。
📋 目录
  1. 快速处理思路
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

跨域请求携带 Authorization 头返回 401 错误,通常是因为凭证格式不正确、Token 已过期,或跨域配置未允许携带凭证。优先检查 Authorization 头是否遵循 Bearer 空格 Token 格式,再确认后端 CORS 是否设置 credentials:true。

先说结论:跨域请求返回 401 未授权,核心问题在于凭证传递链路断裂,需同时验证前端请求头格式和后端跨域配置。

  • 先确认 Authorization 头格式是否为 Bearer 空格 Token
  • 先处理后端 CORS 配置,确保允许携带凭证
  • 再验证 Token 是否过期或签名无效

快速处理思路

遇到跨域 401 错误时,按以下顺序排查:检查浏览器 Network 面板中请求头是否包含 Authorization,确认 Bearer 后有空格;查看后端 CORS 配置是否包含 credentials:true;使用 Postman 手动注入相同 Token 验证后端认证逻辑是否正常。

为什么会这样

跨域请求携带 Authorization 头仍返回 401,本质是认证凭证未正确传递到后端或后端拒绝接收。HTTP 401 Unauthorized 表示客户端请求的资源需要有效身份凭证,但当前请求未提供或凭证无效,与 403 Forbidden 不同,401 暗示客户端可通过提供正确凭证重新尝试访问。跨域场景下,浏览器同源策略会拦截未明确允许的凭证发送,即使前端代码设置了 Authorization 头,若后端 CORS 未配置 credentials:true,Cookie 等凭证也不会被发送。另外,Authorization 头格式错误是高频问题,Bearer 与 Token 之间必须有空格,且 Bearer 首字母需大写,格式不正确时服务器会直接拒绝请求。

分步处理

步骤一:检查前端请求头格式

在浏览器开发者工具 Network 面板中找到报错请求,查看 Request Headers 中 Authorization 字段。正确格式应为 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...,Bearer 后必须有一个空格。若使用 Axios,需在请求拦截器中统一添加:

axios.interceptors.request.use(config => {const token = localStorage.getItem('token');if (token) {config.headers.Authorization = `Bearer ${token}`;}return config;});

步骤二:配置后端 CORS 允许凭证

后端需明确允许跨域请求携带凭证。Node.js Express 示例:

const cors = require('cors');app.use(cors({origin: ['http://localhost:8080', 'http://localhost:8081'],credentials: true}));

credentials:true 允许浏览器发送 Cookie 等认证信息,若缺失该配置,即使前端设置 withCredentials:true,凭证也不会被发送。

步骤三:前端设置 withCredentials

跨域请求时,前端需显式声明携带凭证:

跨域请求携带 Authorization 头为什么返回 401 未授权错误怎么解决
fetch('/api/user', {headers: {'Authorization': `Bearer ${token}`},credentials: 'include'});

Axios 中对应配置为 withCredentials:true。注意:credentials 设置需前后端同时配置,仅前端设置无效。

步骤四:验证 Token 有效性

检查 Token 是否过期,JWT Token 的 payload 部分包含 exp 字段表示过期时间。若 Token 已过期,需引导用户重新登录或调用刷新接口获取新 Token。可在前端添加 Token 过期检测:

function isTokenExpired(token) {const decoded = jwtDecode(token);const expirationTime = new Date(decoded.exp * 1000);return new Date() > expirationTime;}

怎么验证是否生效

完成配置后,在浏览器 Network 面板重新发起请求,确认 Request Headers 中 Authorization 字段格式正确,Response Headers 中包含 Access-Control-Allow-Credentials:true。若仍返回 401,使用 Postman 手动注入相同 Token 和 Authorization 头,若 Postman 请求成功则问题在前端配置,若 Postman 也返回 401 则问题在后端认证逻辑或 Token 本身。

常见坑

Authorization 头拼写错误,如写成 authorizaiton 或缺少 Bearer 前缀,服务器会直接拒绝请求。跨域场景下仅前端设置 withCredentials:true 但后端未配置 credentials:true,凭证仍不会发送。Token 存储在 localStorage 中,若登录成功后未正确保存或后续请求未正确读取,会导致每次请求都使用空值。前后端分离部署在不同域名时,即使登录成功,若 CORS 配置未包含当前前端域名,后续 API 请求也会返回 401。微信小程序生态中,Authorization 头格式同样需遵循 Bearer 空格 Token,缺少 Bearer 前缀是高频错误。

常见问题

Authorization 头格式错误会返回什么状态码

通常返回 401 Unauthorized,部分服务器会返回更具体的错误信息如 Bad Authorization header format。Bearer 与 Token 之间缺少空格、Bearer 首字母小写、缺少 Bearer 前缀都会导致认证失败。

为什么 Postman 请求成功但浏览器请求返回 401

Postman 不受浏览器同源策略限制,可直接发送任意请求头。浏览器请求返回 401 通常是 CORS 配置问题,需检查后端是否设置 Access-Control-Allow-Credentials:true 及允许的前端域名。

Token 未过期但仍返回 401 怎么办

检查 Token 签名密钥是否与后端一致,JWT Token 需使用相同密钥签名和验证。确认后端认证中间件是否正确配置,部分框架需在 Web.config 或路由配置中显式启用认证。

跨域请求是否需要同时设置 Authorization 头和 Cookie

取决于后端认证方式。若后端使用 JWT,只需 Authorization 头;若使用 Session/Cookie 认证,需设置 withCredentials:true 让浏览器发送 Cookie。两种认证方式不应混用。

跨域请求携带 Authorization 头为什么返回 401 未授权错误怎么解决

参考来源

前端请求突然跳转登录页,提示 401 未授权,这背后是怎么回事?

为什么你的请求总是返回 401?:Dify API 认证体系深度拆解

HTTP 401 错误全解析:身份验证机制与故障排查指南

HTTP401"您未被授权查看该页"的常见原因和解决方法_聚合数据 - 天聚地合

手把手教你解决微信小程序接口请求中的 401 unauthorized 问题 (含 Node.js 后端示例)

微信小程序 401 错误终极指南:从报错到 Bearer Token 的正确姿势

解决 POST 请求返回 401 状态码 (未授权) 跨域问题_post 401-CSDN 博客

前端切换端口,系统前后端交互就报 401 错误 (未授权) 的常见原因

HTTP 401 状态码详解:未授权的含义与解决办法

前端报错 401【已解决】