Node.js JWT,从token获取user_id

标签 node.js mongodb token jwt

strong text我正在构建 node.js + mongodb rest api。我使用 jwt 用户身份验证,但遇到问题。我需要获取经过身份验证的用户(user_id,名称)的详细信息,认为可以从 token 中获取它们,但我不知道该怎么做。这怎么可能?

已更新

我正在做一个post请求

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();
      }
    });

解码返回有关用户的所有信息(名称、密码、_id)。是否可以从这里只获取 user_id 和 name?

最佳答案

当您签署 JSON 网络 token 时,您可以将用户对象传递给它。您可以在这里存储您需要的任何用户数据。然后对该对象进行签名和编码,并将其设置为 token 。当您向 API 发送请求并在 auth header 中传递 JWT 时,如果 JWT 有效,您的验证函数应将此用户对象返回给您。

我喜欢使用 Hapi 框架来创建我的 Restful API,因此我将给出一个使用 Hapi 的示例。

在您的 server.js 文件中,您需要注册 hapi-auth-jwt2 包:

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 函数应该获取您从 token 中获得的用户 ID 并查询用户。如果找到用户,那么您就知道 token 是有效的,您可以返回并存储其余的用户信息。

要创建 token ,我使用“jsonwebtoken”包:

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

关于Node.js JWT,从token获取user_id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38624430/

相关文章:

ruby - 手动在 Rails 中生成过期的激活器 token 或 key 哈希

javascript - Mongoose .save() 和使用 update() 之间的区别

node.js - Dokku( digital ocean )client_max_body_size node.js

javascript - 无法通过nodejs中的fs.readFile()读取整个文件

node.js - 如何优雅地重启node.js服务器?

c# - 用 Func 替换 MongoDB 查询中的 lambda 表达式

php - : sudo pecl install mongodb 时出现 fatal error

javascript - 使用 expressJS 将数据插入到 MongoDB

token - 如何编写代码来获取AWS cognito访问 token ?

java - String.split 未按预期运行