【发布时间】:2017-06-23 12:58:54
【问题描述】:
我有一个使用 json 网络令牌的节点应用程序:
var jwt = require('jsonwebtoken');
如果登录成功,则此库以这种方式创建令牌:
var payload = {mydata: 'abcd'};
var token = jwt.sign(payload, 'secret', {
expiresIn: 28800
});
return {
success: true,
message: 'Success',
token: token
};
我不明白令牌在服务器上的存储位置。 如果收到令牌的同一用户调用受保护的资源,那么我有这一行:
jwt.verify(token_sent_by_used, 'secret', function (err, res) {
if(!err){
res.json({result: 'success'});
}
else{
res.json({result: 'failure'});
}
}
我问这个的原因是我找不到在多台机器上运行应用程序时如何处理 jwt 的解释。 如果我的后端放在不同的机器上并且用户向负载均衡器发出请求,那么该请求可以到达任何机器。 如果 jwt 在文件系统上写入令牌数据,那么我猜如果请求命中的机器不是创建令牌的机器,则可能会出现问题。 使用会话时,您可以将会话处理程序设置为数据库。你如何用 jwt 解决这个问题?
****编辑****
好的,让我们举个例子。 我有一个在机器 .10 上运行的节点应用程序,并且同一节点应用程序也在机器 .11 上运行。两台不同的机器。
我去机器 .10 并发送用户名密码。机器 .10 上的应用程序检查用户名/密码。他们都还好。机器 .10 创建一个 jwt 令牌并将其发送给我。
我现在向机器 .11 发出 curl 请求(向需要有效 jwt-token 的资源)发送机器 .10 宝贵发送给我的 jwt-token。机器 .11 不会抱怨 jtw-token 吗?它会被认为是有效的吗?即使它不是在机器 .11 上创建的?
【问题讨论】:
-
Jwt 令牌未存储在服务器上。创建 jwt 令牌服务器后,将该令牌发送给用户/浏览器。然后,您可以将该令牌保存到应用状态、浏览器的本地存储或浏览器的会话存储中。
-
请查看已编辑的问题。
-
Jwt 令牌与机器无关。您只需要在两台机器上使用相同的密钥来解密/加密令牌。
-
Jwt 令牌只是用特定密钥加密的一些数据。只要某台机器有那个密钥,它就可以解密它。