REST | JWT |身份验证:如何验证安全资源的权限

时间:2016-05-27 04:47:29

标签: node.js rest http authentication jwt

基于令牌的身份验证:JWT?校验。 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 }
  1. 我应该发送id& email如果我发行JWT?
  2. 鉴于我应该有中间件检查我的jwt.sub的[userId]值是否存在于数据库中,我应该将此userId用作我的查询的一部分,还是客户端应该发送服务器userId为request.body.userId,因为它在登录/ up时获得它?
  3. 将userId分配给payload.sub
  4. 是否禁止
  5. 我是否需要在每次请求时生成具有新生命周期的新JWT并将其发送给客户?
  6. 我的安全失误是什么,最佳做法是什么,你会做什么?
  7. 我看到的每个教程都展示了一个很好的&清理高级流程[简单地说明'如果JWT已经过验证,资源将被发送到客户端'。

    您能否就如何以低级别工作这些基于令牌的身份验证资料向我提供一些指示 - 即,为了请求安全资源?

    PreThanks,

    科迪

1 个答案:

答案 0 :(得分:1)

这完全是我的观点,我不是专家,在这里:

1)我认为您不应该在您的回复中发送用户ID,因为我没有看到很多情况,客户端需要知道其用户ID,您可以轻松地将其分配给您的令牌有效负载并使用像express-jwt这样的中间件 进行解码并为您提供用户ID。

2)不要依赖客户端发送的敏感数据,如果使用express-jwt,则会为每个请求对象分配用户ID,例如: req.user.userId

3)您可以在有效负载中分配用户ID和其他小型用户会话数据,您的客户端将需要您的密钥并能够解码该信息,并且始终具有强密钥。

4)我认为你应该在一天或更短的时间后使用令牌寿命到期,有些情况你可能需要更长时间我认为1周应该是你应该有你的令牌寿命的最长时间。现在,您可以随时刷新令牌,并在一段时间后检查您的应用程序,如果其令牌有效并请求刷新或在到期后再刷新。

5)可能是这些:

  • 拥有强大的密钥。
  • 使用Cookie存储Web应用程序的密钥
  • 尽可能缩短您的令牌寿命。
  • 对API使用HTTPS协议。
  • 编写中间件或使用现有的中间件进行用户身份验证。例如:express-jwt
  • jwt tutorial tutorial2,使用storm-path并使用passport

希望这有帮助。