Получить идентификатор пользователя от jsonwebtoken в узле с паспортом - PullRequest
0 голосов
/ 17 июня 2019

Я использую стратегию 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 в своей схеме).

Как я могу получить userId из токена? В new JwtStrategy это уже происходит, потому что у меня есть полезная нагрузка, которая позволяет мне findById и, следовательно, аутентифицировать вызов, но я должен каким-то образом повторно использовать этот файл или создать новый с именем, например, getUserId?

Ответы [ 2 ]

0 голосов
/ 24 июня 2019

При подписании 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;
0 голосов
/ 17 июня 2019

Заявка JWT, которая идентифицирует пользователя, представляющего JWT, равна sub.Если вы правильно понимаете ваш код, jwtPayload.sub содержит эту заявку.

Если значение заявки sub содержит то, что вы называете идентификатором пользователя, все готово.

Если вы хотитенайти пользователя на основе другого значения, возможно, полученного из sub, вам нужно будет сообщить нам, как это другое значение связано с утверждениями, содержащимися в JWT.

...