从带有护照的节点中的jsonwebtoken获取用户ID

时间:2019-06-17 02:06:53

标签: node.js mongoose jwt passport.js passport-jwt

我使用passport jwt策略,这是我的代码段:

'use strict';

const config = require('../config');
const User = require('../models/user.model');
const passportJWT = require('passport-jwt');

const ExtractJwt = passportJWT.ExtractJwt;
const JwtStrategy = passportJWT.Strategy;

const jwtOptions = {
    secretOrKey: config.secret,
    jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken()
};

const jwtStrategy = new JwtStrategy(jwtOptions, (jwtPayload, done) => {
    console.log(jwtPayload);
    User.findById(jwtPayload.sub, (err, user) => {
        if (err) return done(err, null);
        if (user) {
            return done(null, user)
        } else {
            return done(null, false)
        }
    })
});

exports.jwtOptions = jwtOptions;
exports.jwt = jwtStrategy;

在这里设置策略,一切正常。现在,我想创建端点以添加带有从令牌中移出的UserId的文章(文章的模式中具有userId String)。

我应该如何从令牌中获取用户ID?new JwtStrategy中,这已经发生了,因为我有有效载荷,可以让我findById来对呼叫进行身份验证,但是应该我以某种方式重用了此文件或创建了一个名为getUserId的新文件?

3 个答案:

答案 0 :(得分:0)

标识提交JWT的用户的JWT声明为sub。如果正确理解您的代码,jwtPayload.sub会包含此声明。

如果sub声明的值包含您所谓的用户ID,那么您就完成了。

如果您要根据其他值(也许是从sub派生的值)来查找用户,则必须告诉我们这个不同的值与JWT中包含的声明有何关系。

答案 1 :(得分:0)

在签署JWT时(创建新令牌),如果您将用户信息添加到jwt payload中,如下所示:

..
....
const payload = {
        userId: user.id,
        email: user.email
      };
      // CREATE A JWT TOKEN
      jwt.sign(payload, secretForJWT, { expiresIn: expirationTimeForJWT },
        (err, token) => {
....
..

然后,您应该能够从解密的令牌中检索userId字段,如下所示:

const jwtStrategy = new JwtStrategy(jwtOptions, (jwtPayload, done) => {
    console.log(jwtPayload);
    const userId = jwtPayload.userId; // YOU SHOULD GET THE USER ID FROM THE PAYLOAD
    User.findById(jwtPayload.sub, (err, user) => {
        if (err) return done(err, null);
        if (user) {
            return done(null, user)
        } else {
            return done(null, false)
        }
    })
});

exports.jwtOptions = jwtOptions;
exports.jwt = jwtStrategy;

答案 2 :(得分:0)

这是我的方法,希望对您有帮助:

const jwt = require('jsonwebtoken');
...
const jwt_payload = jwt.decode(yourJwtInString);
const id = jwt_payload._id;
...