我试图了解基于令牌的身份验证策略如何使用令牌(例如:JWT)来访问特定于用户的数据。我在搜索结果中看到的所有内容都是用户提供用户名和密码时的部分,然后在每次后续调用时创建并验证令牌。
说我有一个包含两个MongoDB集合的Node.JS服务: Users 和 UserMessages 。 UserMessages 中的每个条目都包含 UserID 和消息。
如果经过身份验证的用户想要查看与该用户相关的所有消息,我如何(以编程方式)知道如何过滤正确的消息? 如何在令牌和用户身份之间建立关联(例如: UserID 或其他任何有助于识别用户的内容)我在查询消息集合时需要下一步?
我只想了解这个概念。我无法找到在代码中获得用户身份的明确示例。 Example:
apiRoutes.use(function(req, res, next) {
var token = req.body.token || req.param('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;
next();
}
});
}
});
答案 0 :(得分:2)
JWT包含有效负载。
通常,您将用户的ID放在此有效内容中。您可以将任何您喜欢的内容放在那里,但由于每次请求都会发送令牌,因此您希望将有效负载保持在较小的位置。此外,由于JWT是base-64编码的,任何人都可以解码令牌并查看有效载荷的内容。
但是,因为只有你的服务器知道"秘密"对于JWT,没有人可以改变有效载荷或以其他方式创建虚假的JWT ......您的服务器会认为此类令牌无效。
上面的代码似乎是解码有效负载并将其存储在req
对象上。当它解码JWT时,它也验证签名,因此如果解码成功,您可以信任有效载荷中的数据。现在,您可以使用有效负载中的用户ID来获取所需的数据。