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 } 
  1. 如果我发布智威汤逊,是否应该发送idemail
  2. 鉴于我应该有中间件来检查我的jwt.sub的[ userId ]值是否存在于数据库中,我应该使用这个userId作为我的查询的一部分,或者应该客户端发送Server的userId作为request.body.userId它在login/注册时获得它?
  3. 是否将一个userId分配给payload.sub
  4. 我是否需要根据每个请求生成新的JWT并将其发送给客户?
  5. 我的安全失误是什么,最好的做法是什么,你会怎么做?

我所看到的每一个教程都展示了一个很好的,干净的高级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和使用护照

希望这有助于。