mongodb Node.js JWT,从标记获取用户ID

e5nqia27  于 2022-12-26  发布在  Go
关注(0)|答案(2)|浏览(126)

strong text我正在构建node.js + mongodb rest api。我使用jwt用户身份验证,但遇到了一个问题。我需要获得已验证用户的详细信息(user_id,name),我认为可以从令牌中获得这些信息,但我不知道如何做到这一点。怎么可能做到呢?

    • 已更新**

我正在进行发布请求

router.route('/articles')

  .post(function (req, res) {

      var article= new Article();      
      article.user_id = ???; // here needs user_id
      article.imdb_id = req.body.imdb_id;
      article.title = req.body.title;
      article.thumb = req.body.thumb;

      article.save(function(err) {
          if (err)
              res.send(err);

          res.json({ message: 'Added' });
      });

  });

我需要在文章集合中插入作者ID(user_id),但我不知道如何获得经过验证的user_id。
尝试执行以下操作:

var token = req.body.token || req.query.token || req.headers['x-access-token'];

  if (token) {
    jwt.verify(token, app.get('superSecret'), function(err, decoded) {      
      if (err) {
        return res.json({ success: false, message: 'Failed to authenticate token.' });    
      } else {
        req.decoded = decoded;
        console.log(decoded);
        next();
      }
    });

decoded返回所有关于用户的信息(name,password,_id)。是否可以从这里只得到user_id和name?

mwg9r5ms

mwg9r5ms1#

在对JSON Web令牌进行签名时,您可以向其传递一个用户对象。您可以在此处存储所需的任何用户数据。然后,对该对象进行签名和编码,并将其设置为令牌。当您向API发送请求并在auth标头中传递JWT时,如果JWT有效,则验证函数应将该用户对象返回给您。
我喜欢使用Hapi框架来创建我的Restful API,所以我将给予一个使用Hapi的示例。
在server.js文件中,您需要注册hapi-auth-jwt 2包:

server.register(require('hapi-auth-jwt2'), (err) => {
    if (err) {
        throw err;
    }

    server.auth.strategy('jwt', 'jwt', {
        key: config.jwt.secret,
        validateFunc: auth.validate,
        verifyOptions: { algorithms: ['HS256'] }
    });

    server.auth.default('jwt');
});

您的验证功能:

export default {
    validate: (tokenObject, req, callback) => {
        validateToken(tokenObject.user_id, (err, user) => {
            if (err) {
                callback(Boom.unauthorized('User is unauthorized.'), false);
            } else {
                req.user = user;
                callback(null, true);
            }
        });
    }
};

validateToken函数应该获取从令牌中获取的用户id并查询该用户,如果找到了用户,那么您就知道令牌是有效的,并且可以返回并存储其余的用户信息。
要创建令牌,我使用“jsonwebtoken”包:

generateToken: (user_id, name, callback) => {
    'use strict';
    callback(null, JWT.sign({
        user_id: user_id,
        name: name
    }, config.JWT.SECRET, {
        expiresIn: 86400
    }));
}
axzmvihb

axzmvihb2#

假设您需要验证从用户发送的令牌是否已经在您的数据库中(我们将称之为protect

const {promisify} = require('util');
const jwt = require('jsonwebtoken');
const User = require('./../models/userModel');

...

exports.protect = catchAsync(async(req, res, next) => {
// 1) Getting token and check if it's there in headers
let token;

//authorization is the name of the header token
if (req.headers.authorization) {
    token = req.headers.authorization;
}

if (!token) {
    return next(new AppError('You are not logged in! Please Login To get Access.', 401));
}

// 2) Verification Token is a valid token
const decoded = await promisify(jwt.verify)(token, process.env.JWT_SECRET);
// WE CAN GET THE USER ID FROM DECODED



// 3) Check if user still exists not deleted
const currentUser = await User.findById(decoded.id);
if (!currentUser) {
    return next(new AppError('the user does not exist.', 401));
}else{
// WHAT EVER YOU WANT TO DO AFTER CHECKING USER FOUND IN DATABASE

})

相关问题