Node.js JWT,从 token 中获取 user_id

Posted

技术标签:

【中文标题】Node.js JWT,从 token 中获取 user_id【英文标题】:Node.js JWT, get user_id from token 【发布时间】:2016-12-02 03:23:21 【问题描述】:

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 返回有关用户的所有信息(名称、密码、_id)。是否可以从这里仅获取 user_id 和 name?

【问题讨论】:

嗨,你终于找到提取用户ID的方法了吗?我也有同样的问题。 你发现了吗? 【参考方案1】:

当您签署 JSON Web 令牌时,您可以将用户对象传递给它。在这里,您可以存储您需要的任何用户数据。然后对该对象进行签名和编码并设置为令牌。当您向 API 发送请求并在 auth 标头中传递 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 函数应该获取您从令牌中获取的用户 ID 并查询用户。如果找到用户,那么您就知道令牌是有效的,您可以返回并存储其余的用户信息。

要创建令牌,我使用“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的主要内容,如果未能解决你的问题,请参考以下文章

页面刷新时 JWT Token 已从标题中删除,如何修复?

在 node.js 中生成的 JWT(JSON Web Token) 未在 java 中验证

如何从 Node.js 中的 jwt 令牌获取 user.id?

尝试在 Node.js 和 React 中获取 jwt 键时出现语法错误

Node.js:登录后在 URL 中发送带有令牌(JWT)的新请求

JSON Web Tokens(JWT)