GET /items/:id
......怎么样?这是一个小问题,但可能是一个很大的答案,因为我对此有点新......
一旦我为客户提供了一个JWT - 他们希望获得资源 - 验证客户端的逻辑流程是什么样的?
换句话说,我有一个JWT 有效载荷,例如......
{
...
"sub": user.id
...
}
...并且客户需要在998
处访问项目 /api/items/:id
...
我目前的方法如下所示。
// ItemsController.lang | 'GET /api/items/:id'
var userId = jwt.decode(token).sub;
var isValid = checkUserIdInDatabase(userId);
var secureResource = ORM.findOne({ user: userId, id: request.itemId });
response.send(secureResource);
除此之外,当客户注册/进入时,我向他们提供了一个响应,看起来像这样......
{ user: { id: 998, email: 'no@username.com', preferences: [...] }, jwt: token }
id
& email
如果我发行JWT?jwt.sub
的[userId
]值是否存在于数据库中,我应该将此userId用作我的查询的一部分,还是客户端应该发送服务器userId为request.body.userId
,因为它在登录/ up时获得它?payload.sub
?我看到的每个教程都展示了一个很好的&清理高级流程[简单地说明'如果JWT已经过验证,资源将被发送到客户端'。
您能否就如何以低级别工作这些基于令牌的身份验证资料向我提供一些指示 - 即,为了请求安全资源?
PreThanks,
科迪
答案 0 :(得分:1)
这完全是我的观点,我不是专家,在这里:
1)我认为您不应该在您的回复中发送用户ID,因为我没有看到很多情况,客户端需要知道其用户ID,您可以轻松地将其分配给您的令牌有效负载并使用像express-jwt这样的中间件 进行解码并为您提供用户ID。
2)不要依赖客户端发送的敏感数据,如果使用express-jwt,则会为每个请求对象分配用户ID,例如: req.user.userId
3)您可以在有效负载中分配用户ID和其他小型用户会话数据,您的客户端将需要您的密钥并能够解码该信息,并且始终具有强密钥。
4)我认为你应该在一天或更短的时间后使用令牌寿命到期,有些情况你可能需要更长时间我认为1周应该是你应该有你的令牌寿命的最长时间。现在,您可以随时刷新令牌,并在一段时间后检查您的应用程序,如果其令牌有效并请求刷新或在到期后再刷新。
5)可能是这些:
希望这有帮助。