我有一个使用json web令牌的节点应用程序:
var jwt = require('jsonwebtoken');
如果登录成功,则此库以这种方式创建令牌:
var payload = {mydata: 'abcd'};
var token = jwt.sign(payload, 'secret', {
expiresIn: 28800
});
return {
success: true,
message: 'Success',
token: token
};
Run Code Online (Sandbox Code Playgroud)
我不明白的是令牌存储在服务器上的位置.如果收到令牌的同一用户调用受保护资源,那么我有这一行:
jwt.verify(token_sent_by_used, 'secret', function (err, res) {
if(!err){
res.json({result: 'success'});
}
else{
res.json({result: 'failure'});
}
}
Run Code Online (Sandbox Code Playgroud)
我问这个的原因是我找不到解释如何在跨多台机器运行应用程序时处理jwt.如果我的后端放在不同的机器上,并且用户向负载均衡器发出请求,那么请求可以命中任何机器.如果jwt在文件系统上写入令牌数据,那么我想如果请求命中的机器不是创建令牌的机器,则可能会出现问题.使用会话时,可以将会话处理程序设置为数据库.你如何用jwt解决这个问题?
****编辑****
好吧,让我们来看看.我有一个在机器.10上运行的节点应用程序,同样的节点应用程序也在机器上运行.11.两台不同的机器.
我去机器.10并发送用户名密码.机器上的应用程序.10检查用户名/密码.他们都还好.Machine .10创建一个jwt令牌并将其发送给我.
我现在发出一个curl请求(对一个需要有效jwt-token的资源)来加工.11并发送机器.10已经发送给我的jwt-token.机器.11不会抱怨jtw-token?它会被认为有效吗?即使它不是在机器上创建的.11?
问题中的两个服务器都必须能够验证令牌 - 它们必须能够生成签名.如果两个服务器共享相同的密钥(用于最初在.10上生成令牌的签名),则两者都能够验证其内容.
在下面的屏幕截图中,红色部分和紫色部分都是纯文本 - 任何人都可以阅读和修改它们.但是,蓝色部分是特殊的 - 它只能在服务器上使用密钥从红色和紫色部分生成.因此,它保证红色和紫色部分不被篡改.
因此,当您将整个JTW发送回服务器时,它可以使用密钥生成蓝色部分并将其与您要发送的蓝色部分进行比较.如果它们不匹配,则某人(非法)改变了红色或紫色部分,因此认证被拒绝.
| 归档时间: |
|
| 查看次数: |
3161 次 |
| 最近记录: |