jsonwebtoken 报错 incalid Token
课代表说 : 我遇到这个问题是因为 是使用 VScode 的 REST Client 插件做请求测试的时候书写问题导致的
问题
下面是 token 签发代码的测试例子
export const signToken = (opations : SignTokenOpations) =>{
const {payload} = opations;
const token = jwt.sign(payload , PRIVATE_KEY , {algorithm : "RS256"});
return token;
}
下面是 token 验证的测试例子
export const author = (
request: Request,
response : Response,
next : NextFunction
) => {
try {
// 确认头存在
const authorization = request.header("Authorization");
if (!authorization) throw new Error("UNAUTHORIZATION");
// 确认 token 存在
const token = authorization.replace("Bearer " , " ")
if (!token) throw new Error("UNTOKEN");
//校验token
jwt.verify(token , PUBLIC_KEY , {algorithms : ["RS256"]})
next();
} catch (error) {
next(new Error(error.message));
}
}
运行之后总是会报错 incalid Token
搜索过程中发现的其他问题的解决方法
token 令牌中的空格没有去掉
Bearer的空格没有去除- 如果使用
replace的话注意第一个参数的Bearer后面需要加空格 - 也可以使用
split直接根据空格分隔
- 如果使用
const token = authorization.split(" ")[1];
请求报错是 invalid signature
看到有的小伙伴token 和 公钥都没有问题 , 通过.decode 就正常 , 使用.verify 就会遇到问题 , 是通过base64 key 或者 直接在token 后面加的.toString() 解决的 , 暂时没有遇到这个问题 , 有遇到的朋友可以尝试一下
jwt.verify(token.toString() , PUBLIC_KEY , {algorithms : ["RS256"]})
我的问题
排查问题的时候直接将token 输出到了终端 , 然后发现token 的两端是带着"的 , 一时比较恍惚 , 还特地用一行console.log("1") 验证了一下终端输出是不带" 的 , 所以知道了肯定是请求时将" 也作为标头的一部分发出了
下面是我的通过REST Client 插件设置的请求
POST {{url}}/auth
Authorization: "Bearer eyJhbGciOiJSUzI1NiIsInR5c...."
两端顺手打上的"" 就是罪魁祸首
解决方法
最直接的解决方法就是直接讲"" 删除
REST Client 还支持请求变量 可以讲一个请求的 请求 或 响应的内容直接读取并作为请求的一部分 , token 是在用户登录时签发的 , 大概像下面这样:
POST {{url}}/login
{{header}}
{
"name" : "drx",
"password" : "2222222"
}
可以在请求的前一行加入# @name 变量名 来创建一个请求变量 , 存储这一请求:
# @name login
POST {{url}}/login
{{header}}
{...}
这个请求的响应结构如下:
{
"id": 22,
"name": "drx",
"token": "eyJhbGciOiJSUz..." }
然后在用户验证中直接使用login 请求得到的响应中的 token 字段
POST {{url}}/auth
Authorization: Bearer {{login.response.body.$.token}}
其中的
login就是刚才存储的请求变量 ,$表示的是响应体中最外侧的根{}
希望对看到这篇文章的您有帮助
/*
* _oo0oo_
* o8888888o
* 88" . "88
* (| -_- |)
* 0\ = /0
* ___/`---'\___
* .' \\| |// '.
* / \\||| : |||// \
* / _||||| -:- |||||- \
* | | \\\ - /// | |
* | \_| ''\---/'' |_/ |
* \ .-\__ '-' ___/-. /
* ___'. .' /--.--\ `. .'___
* ."" '< `.___\_<|>_/___.' >' "".
* | | : `- \`.;`\ _ /`;.`/ - ` : | |
* \ \ `_. \_ __\ /__ _/ .-` / /
* =====`-.____`.___ \_____/___.-`___.-'=====
* `=---='
*
*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* 佛祖保佑 永不宕机 永无BUG
*/