基于 token 的身份验证:JWT?查看。 GET/items/:id
...怎么做?
这是一个小问题,但可能是一个大问题,因为我对此有点陌生......
一旦我向客户提供了 JWT——他们希望获得资源——验证客户的逻辑流程是什么样的?
换句话说,我有一个 JWT payload 比如...
{
...
"sub": user.id
...
}
... 并且客户端需要在 /api/items/:id
访问 item 998
...
我目前的方法类似于以下内容。
// 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 }
- 如果我要发布 JWT,是否应该发送
id
和email
? - 鉴于我应该有中间件来检查我的
jwt.sub
的 [userId
] 值是否存在于数据库中,我是否应该使用这个 userId 作为我的一部分查询,或者客户端是否应该将 userId 作为request.body.userId
发送给服务器,因为它在登录/注册时获得它? - 将 userId 分配给
payload.sub
是一种禁忌吗? - 我是否需要根据每个请求生成具有新生命周期的新 JWT 并将其发送给客户端?
- 我的所有安全失误是什么,最佳做法是什么,您会怎么做?
我看过的每个教程都显示了一个漂亮干净的高级流程,[简单] 说明“如果 JWT 得到验证,资源将发送到客户端”。
关于所有这些基于 token 的身份验证应该如何在低级别工作——即,为了请求安全资源,你能给我一些指导吗?
致谢
科迪
最佳答案
这完全是我的观点,我不是专家,这里是:
1) 我认为你不应该在你的响应中发送用户 ID,因为我认为在很多情况下客户端需要知道它的用户 ID,你可以轻松地将它分配给你的 token 负载并使用像express-jwt这样的中间件 进行解码并为您提供用户 ID。
2) 不要依赖客户端发送的敏感数据,如果你使用 express-jwt 那么它会为每个请求对象分配用户 ID 例如:req.user.userId
3) 您可以在您的负载中分配用户 ID 和其他小型用户 session 数据,您的客户端将需要您的 key 并能够解码该信息,始终拥有一个强大的 key 。
4) 我认为您应该让 token 生命周期在一天或更短时间后到期,在某些情况下您可能需要更长的时间,我认为 1 周应该是您应该拥有 token 生命周期的最长时间。现在您可以随时刷新您的 token ,并让您的应用程序在一段时间后检查其 token 是否有效,并在到期后请求刷新或新 token 。
5) 可能是这些:
- 拥有强大的 key 。
- 使用 cookie 来存储 web 应用程序的 key
- 尽可能缩短 token 的生命周期。
- 为 API 使用 HTTPS 协议(protocol)。
- 编写中间件或使用已有的中间件进行用户身份验证。例如:express-jwt
- jwt tutorial tutorial2 , 使用 storm-path并使用 passport
希望这对您有所帮助。
关于node.js - 休息 |智威汤逊 |授权 : How To Verify Authorities For Secure Resources,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37475048/