使用jsonwebtoken库签名JWT时首次调用失败二次调用成功问题
解决jsonwebtoken首次RS256签名失败、二次调用成功的问题
你的问题根源在于私钥字符串开头的多余换行符:
看你提供的可复现代例,key变量的字符串开头带有一个换行(const key = `\n-----BEGIN RSA PRIVATE KEY-----` ),jsonwebtoken第一次解析这个密钥时,无法正确识别它是有效的RSA非对称密钥,因此抛出secretOrPrivateKey must be an asymmetric key when using RS256错误。第二次调用成功,是因为库内部在首次解析失败后自动对密钥做了格式化处理(比如去除首尾空白),或是在REPL环境下变量被隐式修正了。
解决方法
直接处理密钥格式即可,两种方式任选:
- 修改私钥字符串,去掉开头的换行
const key = `-----BEGIN RSA PRIVATE KEY----- MIIJJwIBAAKCAgEA8zU0rd1bYdSO87arVBUYhguq7NWqSwkh89chRiOpFSU40Fac aBCg5IAIU/qh25YsMRuBG+WzWg5s+NtbK8cnlT4pCKU7XGG8iMVa04MYC5wOlPY9 ...(剩余私钥内容) -----END RSA PRIVATE KEY-----`
- 传入前对密钥做trim处理
调用jwt.sign时,用trim()去除密钥字符串首尾的空白字符:
const token = jwt.sign({iss: id, client_id: id}, key.trim(), {algorithm:"RS256"});
额外提醒
你代码里有个笔误:client_it应该是client_id,虽然不影响签名生成,但建议修正避免后续业务逻辑出错。
内容的提问来源于stack exchange,提问作者Charles Dupont
相关产品推荐
相关产品推荐

