Passport-jwt 身份验证不适用于 node-jwt-simple

Passport-jwt authenticate not working well with node-jwt-simple

我正在使用 passport-jwt 来验证一些路由,我正在使用 node-jwt-simple/jwt-simple 创建我的 jwts 但面临一些困难,因为它看起来像我的 passport-jwt 身份验证中间件根本没有被调用。

这是我的

护照-jwt-策略

const jwtOpts = {
    jwtFromRequest: ExtractJwt.fromHeader('Authorization'),
    secretOrKey: secret,
};

passport.use(new jwtStrategy(jwtOpts, (payload, done) => {

    console.log('payload ', payload.sub);
    User.findById(payload.sub, (err, user) => {
        
        if(err) { return done(err); }

        if(!user) { console.log('didnt find!'); return done(null, false); }

        done(null, user);
    });
}));

然后我将它整合到这里。

路由文件

router.get('/success', 
           passport.authenticate('jwt', {session: false}),
           async (ctx, next) => ctx.body = await "success!");

这也是我制作 jwt.

的方法

function tokenForUser(user) {
    
    const timeStamp = new Date().getTime;
    return jwt.encode({sub: user._id, iat: timeStamp}, secret);
}

//- Later in signup process

userToSave.save(async(err, user) => {
    
    if(err) { return next(err); }

    const token = await tokenForUser(user);

    next(token);
});


//- If this helps, here is how my secret file looks like.

const secret = "JKAha23ja1ddHdjjf31";

export default secret;

问题来了,当我点击那条路线时,我只得到 Unauthorized 并且在控制台中没有任何东西被注销 甚至我首先指定的 'payload' 键也没有注销.

我还应该说我在 ctx.request.get('Authorization') 有令牌(基于 Koa)我认为它类似于 req.header('Authorization') 在所有路线中都有快递。

此外 确切的基于快递的问题 可以在 node-jwt-simple here 的 github 问题上找到,以防我的问题代码示例。

谢谢。

在我正确地思考之后,我知道这是我对整个身份验证过程如何运作的可怕理解。

当我从 ctx.get('Authorization') 解码令牌时,我得到的 _id 与存储在数据库中的令牌不同 因为 我硬编码了 授权header在postman和thought"If I ctx.set('Authorization', token); It will replace the one I hardcoded on postman".

当我在前端进行 http 调用时,我没想到 jwt 会包含在 header 请求中。

我天真地认为 jwts 是直接从服务器传递到浏览器的(类似于 render 的工作方式)并且 Not 从服务器传递到浏览器一个 ajax 过程,稍后将其嵌入请求中,这是正确的方法。

整个代码很棒,除了现在我在注册时必须在创建令牌后传递令牌 ctx.body = token;

谢谢。