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

React中带Authorization头的GET请求验证JWT时返回无效令牌问题

React Fetch请求JWT验证失败:仅拼接localStorage令牌时出错

问题描述

从localStorage获取JWT令牌后,通过Fetch请求调用API验证,始终返回“Invalid token”。但直接在代码中写死相同的令牌,请求就能正常通过;把React里的请求复制到浏览器控制台执行也能成功。

已确认以下信息:

  • localStorage中存储的令牌内容正确
  • 请求前确实成功获取到了令牌
  • 请求头的Authorization字段看似包含正确的令牌

无法正常工作的代码

const token = localStorage.getItem('token'); 
fetch("http://localhost/api/checktoken.php?username=davide", { 
  method: 'GET', 
  headers:{ 
    'Content-Type': 'application/json', 
    'Authorization': "Bearer " + token, 
  }, 
})

可正常工作的代码

fetch(`http://localhost/api/checktoken.php?username=davide`, {
    method: 'GET',
    headers: {
      'Content-Type': 'application/json',
      Authorization: `Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJvbmNvbnN1bHRpbmciLCJhdWQiOiJjbGllbnRzIiwiaWF0IjoxNzAxNTI5NjgyLCJuYmYiOjE3MDE1Mjk2OTIsImRhdGEiOnsidXNlcm5hbWUiOiJkYXZpZGUuZ2FnbGlvbmUiLCJsYW5ndWFnZSI6IkVuZyIsImVudmlyb25tZW50cyI6W3sibmFtZSI6ImVudjEifSx7Im5hbWUiOiJlbnYyIn1dfX0.iC2NntlW6rFx2s6pacSFw6Y_5ib3Bh8jhFl2-MMTX-Q`,
    },
  })

解决方案

1. 去除令牌首尾空白字符

localStorage存储的令牌可能意外带有换行、空格等空白字符,拼接后会破坏JWT的格式,导致验证失败。直接写死的令牌没有这些多余字符,所以能通过验证。

修改代码,添加trim()清理空白:

const token = localStorage.getItem('token')?.trim(); // 清除首尾空白
fetch("http://localhost/api/checktoken.php?username=davide", {
  method: 'GET',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${token}`
  },
})

2. 检查令牌是否被序列化存储

如果存储令牌时用了JSON.stringify,取出的令牌会带有双引号(比如"eyJ0eXAi..."),这会导致JWT格式错误。此时需要用JSON.parse解析:

// 若存储时执行了JSON.stringify(token),取出时需解析
const token = JSON.parse(localStorage.getItem('token'))?.trim();
fetch("http://localhost/api/checktoken.php?username=davide", {
  method: 'GET',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${token}`
  },
})

3. 调试实际发送的请求头

在浏览器开发者工具的Network面板,对比两种请求的实际请求头:

  • 按F12打开开发者工具,切换到Network标签
  • 触发Fetch请求,找到对应的API请求
  • 查看Request Headers中的Authorization字段,复制内容和代码中写死的令牌对比
  • 检查是否存在字符差异(比如多余引号、编码问题)

辅助调试代码

在请求前添加日志,确认令牌的实际内容:

const token = localStorage.getItem('token');
console.log('从localStorage获取的令牌:', token);
console.log('令牌长度:', token?.length);
console.log('生成的Authorization头:', `Bearer ${token}`);

// 执行请求
fetch("http://localhost/api/checktoken.php?username=davide", {
  method: 'GET',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${token}`
  },
})

通过日志可以直观看到令牌是否存在异常,比如长度不符、包含多余字符等。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 19:37:51