如何正确验证JWT,使token.split(':')[1]与密钥testTest匹配
校验逻辑说明
你当前写的jwt.verify代码逻辑为:将传入的token参数按冒号分割,取第二个分段作为待校验的JWT串,用固定密钥testTest做签名校验,要让校验返回true,满足以下要求即可:
校验通过核心前提
token.split(':')[1]提取到的内容必须是合法JWT格式,也就是标准的header.payload.signature三段base64url编码结构,不能缺段、不能有多余特殊字符。- 该JWT必须是用密钥
testTest、匹配JWT header中声明的签名算法(默认是HS256)签发生成的,内容未被篡改,也没有触发额外校验规则(比如过期、签发人不匹配等)。
测试用合法token生成方法
如果你需要自己生成符合要求的token做测试,按以下步骤操作:
- 用对应语言的JWT库生成签名密钥为
testTest的JWT,以Node.js的jsonwebtoken库为例,生成代码为:
const validJwt = jwt.sign({ /* 自定义payload内容 */ }, 'testTest');
- 把生成的JWT拼接到冒号后面,组成完整的
token参数传入即可,示例:
const token = `anyPrefix:${validJwt}`; // 此时调用你的校验代码即可校验通过 jwt.verify(token.split(':')[1], 'testTest')
常见校验失败排查方案
- 先打印
token.split(':')[1]的结果,确认提取的内容完整没有错误:如果你的token字符串中有多个冒号,split(':')[1]只会取第二个分段,要确认取到的是完整的JWT串。 - 把提取到的JWT串放到本地JWT调试工具中,填入密钥
testTest验证签名有效性,如果提示签名无效,说明签发JWT时用的密钥和testTest不一致,或者JWT内容被篡改。 - 如果JWT payload中带
exp过期声明,确认当前时间没有超过过期时间,不需要校验过期的话可以给verify加配置:jwt.verify(token.split(':')[1], 'testTest', { ignoreExpiration: true })
内容的提问来源于stack exchange,提问作者user15564093
相关产品推荐
相关产品推荐

