2016-07-27 100 views
2

強壯的文本我正在構建node.js + mongodb rest api。我使用jwt用戶身份驗證,我有一個問題。我需要獲取經過身份驗證的用戶(user_id,name)的詳細信息,認爲它們可以從令牌獲得,但我不知道如何執行此操作。怎麼可能做到?Node.js JWT,從令牌獲取user_id

修訂

我做一個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和名稱?

回答

0

當您簽署JSON Web令牌時,您可以將它傳遞給用戶對象。在這裏你可以存儲你需要的任何用戶數據。然後對該對象進行簽名和編碼並設置爲令牌。當您向API發送請求時,如果JWT有效,那麼驗證函數應該將此用戶對象返回給您。

我喜歡使用Hapi框架來創建我的Restful API,所以我將舉一個使用Hapi的例子。

在你server.js文件,你需要註冊HAPI認證 - 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 
    })); 
}