JWT鉴权时出现JsonWebTokenError: jwt malformed错误如何解决?
jwt malformed 报错的核心原因是服务端拿到的待校验字符串不符合JWT标准的三段式结构(由两个.分隔的Base64URL格式字符串组成),按优先级从高到低排查即可定位问题:
优先排查:token变量取值错误
你的signIn方法返回的是{ token: 实际token值 }的对象,若测试代码中调用登录接口后直接将返回的整个对象赋值给token变量,拼接在Authorization头里的内容就会变成Bearer [object Object],完全不符合JWT格式,这是该场景下最高发的错误。
修复方案:调用登录接口后正确提取token字段,示例:// 错误写法 const token = await authService.signIn(authParams) // 正确写法 const { token } = await authService.signIn(authParams)检查Authorization头格式
确认'Bearer ' + token中Bearer后面的空格是正常半角空格,没有多打、少打或使用全角空格。同时检查你console.warn(token)打印出的token值,确认前后没有多余的空格、换行符、引号等冗余字符,且结构符合两段.分隔的三段式结构。检查JWT生成与校验配置一致性
确认jwtService.sign时使用的加密配置(密钥、加密算法等)和校验阶段的配置完全一致,没有拼写错误或配置不一致的问题。如果使用框架封装的JWT能力(如NestJS的JwtModule),确认全局注册的配置和校验策略读取的配置是同一份。检查服务端token提取逻辑
你目前只提供了校验payload的validate方法,没有提供JWT策略中从请求头提取token的逻辑,需要确认提取逻辑是正确切割Authorization头取Bearer后的内容,没有误将Bearer前缀一起带入校验逻辑,也没有切割错误丢失了token的部分字符。标准提取逻辑示例:const authHeader = req.headers.authorization const token = authHeader?.split(' ')?.[1]
内容的提问来源于stack exchange,提问作者A Mehmeto

