jsonwebtoken 报错 incalid Token 的记录

83 阅读2分钟

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
 */