如何使用 passport-jwt 正确检查令牌有效负载?

Posted

技术标签:

【中文标题】如何使用 passport-jwt 正确检查令牌有效负载?【英文标题】:How to correctly check tokens payload with passport-jwt? 【发布时间】:2018-01-25 14:33:50 【问题描述】:

我目前正在尝试实现passport-jwt,并且我有一个方法可以使用jwt-simple 创建我的令牌,其中包含用户的密钥。

async createToken(u: string, p: string)
    let user = await this.us.model.findOne('key': u)
    if (user.key == u)
        let payload = 'key': u
        let token = jwt.encode(payload, "Banana")
        return token;
    

我手动将其放入邮递员令牌并尝试获取此路线。我正在使用pleerock/routing-controllers @UseBefore 在到达方法之前调用中间件。

@Get("/test")
@UseBefore(passport.authenticate("jwt",  session: false ))
test(@Res() response: Response)
    response.send("Test done.")

这是我如何设置passport-jwt的策略

let OPTJWT = 
    secretOrKey: 'Banana',
    jwtFromRequest: jwt.ExtractJwt.fromAuthHeader()

passport.use(new jwt.Strategy(OPTJWT, async ( jwt_payload, done) => 
        console.log(jwt_payload)
        let user = await mongoose.model("users").findOne('key': jwt_payload.key);
        console.log(user)
        if (user) 
            return done(null, 
                key: jwt_payload.key
            );
         else 
            console.log("User not found")
            return done(new Error("User not found"), null);
        
    
    ));


app.use(passport.initialize())

我输入了 console.log() 以打印出护照得到的内容,但控制台没有写出任何内容。即使我确定给定的令牌有效负载是用户数据库中的现有密钥,该路由也只会返回未经授权的 (Postman)。 所以我的问题是我做错了什么?

【问题讨论】:

你初始化护照了吗? 我更新了我的样本,是的,我更新了 你在没有任何装饰的情况下测试过它吗?只是简单的表达。 装饰是我的路由,删除它然后设置快递不是我正在寻找的解决方案 我知道这不是你要找的,只是为了测试,使用 express(很容易设置)。这将帮助您解决问题。 【参考方案1】:

问题是jwt.ExtractJwt.fromAuthHeader(),由于某种原因它无法识别授权标头,所以这个jwt.ExtractJwt.fromHeader("authorization") 有效。

【讨论】:

以上是关于如何使用 passport-jwt 正确检查令牌有效负载?的主要内容,如果未能解决你的问题,请参考以下文章

Passport-jwt 不同的令牌相同的结果

我在我的 nestJS 应用程序(使用 authGuard)中使用了 passport-jwt 身份验证策略,如何访问我的控制器中的令牌有效负载?

如何在 passport-jwt 中获取 rawJWT 字符串?

Passport-jwt 令牌过期

NodeJs Express passport-jwt 从令牌中获取错误的用户

在获取用户时使用 Passport-jwt 时 req.user 未定义