REST | 智威汤逊| 身份validation:如何validation安全资源的权限
基于令牌的身份validation:智威汤逊? 检查。 GET /items/:id
…怎么样?
这是一个小问题,但可能是一个很大的答案,因为我对这个有点新…
一旦我为客户提供了一个JWT,他们希望获得一个资源 – validation客户端的逻辑stream程是什么样的?
换句话说,我有一个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.sub
的[userId
]值是否存在于数据库中,我应该使用这个userId作为我的查询的一部分,或者应该客户端发送Server的userId作为request.body.userId
它在login/注册时获得它? - 是否将一个userId分配给
payload.sub
? - 我是否需要根据每个请求生成新的JWT并将其发送给客户?
- 我的安全失误是什么,最好的做法是什么,你会怎么做?
我所看到的每一个教程都展示了一个很好的,干净的高级stream程,简单地说' 如果JWT被validation了,资源被发送到客户端 '。
您能否就我所提供的所有基于令牌的身份authentication工作应该在低级别上工作提供一些指导 – 即为了请求安全资源?
PreThanks,
科迪
这完全是我的观点,我不是专家,这里是:
1)我认为你不应该发送用户ID在你的回应,因为没有很多的情况下,我看到这将是必要的,客户知道它的用户ID,你很容易地分配这个到你的令牌有效载荷和使用一个中间件express-jwt做解码并给你的用户id。
2)不要依赖客户端发送的敏感数据,如果使用express-jwt,那么它将为每个请求对象分配用户ID,例如: req.user.userId
3)您可以在您的有效载荷中分配用户ID和其他小型用户会话数据,您的客户端需要您的密钥,并能够解码该信息,总是有一个强大的密钥。
4)我认为你应该有一天或更less的令牌寿命到期,有一些情况下,你可能需要更长的时间,我认为1周应该是最长的时间,你应该有你的令牌寿命。 现在您可以随时刷新您的令牌,并在某个时间间隔之后检查您的应用程序,如果令牌有效并且在过期后请求刷新或新的令牌。
5)可能是这些:
- 有一个强大的秘密钥匙。
- 使用Cookie存储Web应用程序的密钥
- 保持令牌的寿命尽可能短。
- 使用API的HTTPS协议。
- 编写一个中间件或使用已有的中间件进行用户authentication。 例如: express-jwt
- jwt教程 教程 2 ,使用风暴path和使用护照
希望这有助于。