【问题标题】:Get user id from jsonwebtoken in node with passport使用护照从节点中的 jsonwebtoken 获取用户 ID
【发布时间】:2019-10-30 14:44:00
【问题描述】:

我使用passport jwt 策略,这是我的代码 sn-p:

'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 字符串)。

我想如何从令牌中获取 userId?

new JwtStrategy 中已经发生了这种情况,因为我有有效负载,可以让我使用findById 并因此验证调用,但我应该以某种方式重用这个文件还是创建新的名称,例如 getUserId?

【问题讨论】:

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


    【解决方案1】:

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

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

    如果您想根据不同的值(可能源自sub 的值)查找用户,您必须告诉我们这个不同的值与 JWT 中包含的声明有何关联。

    【讨论】:

    • 这里if (user) {here 我可以访问用户对象,但我不确定我是否应该重用这个文件,因为它是 passport.js 配置文件 - 设置策略
    • 在这个if 我可以添加例如exports.user = user; 然后在其他地方需要它并可以访问用户数据但我不确定这是否是正确的做法,如果它会弄乱护照不知何故,我是这个图书馆的新手
    【解决方案2】:

    在签署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;
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-03
        • 2017-11-22
        • 2020-02-13
        • 1970-01-01
        • 1970-01-01
        • 2020-09-23
        • 1970-01-01
        相关资源
        最近更新 更多