node.js - 休息 |智威汤逊 |授权 : How To Verify Authorities For Secure Resources

标签 node.js rest http authentication jwt

基于 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 }
  1. 如果我要发布 JWT,是否应该发送 idemail
  2. 鉴于我应该有中间件来检查我的 jwt.sub 的 [userId] 值是否存在于数据库中,我是否应该使用这个 userId 作为我的一部分查询,或者客户端是否应该将 userId 作为 request.body.userId 发送给服务器,因为它在登录/注册时获得它?
  3. 将 userId 分配给 payload.sub 是一种禁忌吗?
  4. 我是否需要根据每个请求生成具有新生命周期的新 JWT 并将其发送给客户端?
  5. 我的所有安全失误是什么,最佳做法是什么,您会怎么做?

我看过的每个教程都显示了一个漂亮干净的高级流程,[简单] 说明“如果 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/

相关文章:

javascript - 模块.js :491 throw err;

javascript - 如何从 NodeJS 中的存储压缩文件 PDF

javascript - NodeJS 变量 session 未定义

c# - WCF REST 文件上传

android - 改造 2 : responseBodyConverter converts to null object

python - 使用 url 编码 python 制作一个简单的 GET/POST

mysql - NodeJs & MySql : results. 当表 id 是 UUID 时 insertId 总是 0

python - Rest API 应用程序在 'Sandbox' 但不是 'Live' 工作

api - Office365 日历 REST Api 中日历 View 端点每页返回的最大事件数是多少?

node.js - 在流式 HTTP 客户端之间共享 DEFLATE 压缩的数据 block