休息 |智威汤逊 | Auth:如何验证安全资源的权限
Posted
技术标签:
【中文标题】休息 |智威汤逊 | Auth:如何验证安全资源的权限【英文标题】:REST | JWT | Auth: How To Verify Authorities For Secure Resources 【发布时间】:2016-09-25 07:05:53 【问题描述】:基于令牌的身份验证:JWT?查看。 GET /items/:id
... 怎么样?
这是一个小问题,但可能是一个很大的答案,因为我对此有点陌生......
一旦我为客户提供了 JWT——他们希望获得资源——验证客户端的逻辑流程是什么样的?
换句话说,我有一个 JWT payload 比如...
...
"sub": user.id
...
...并且客户需要通过998
/api/items/:id
...访问item...
我目前的方法如下所示。
// 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
] 值是否存在于数据库中,我应该将此用户 ID 用作我的查询的一部分,还是应该客户端将用户 ID 作为 @ 发送给服务器987654331@,因为它是在登录/注册时获得的?
是否禁止将 userId 分配给 payload.sub
?
我是否需要根据每个请求生成具有新生命周期的新 JWT 并将其发送给客户端?
我的所有安全错误是什么,最佳做法是什么?您会怎么做?
我查看的每个教程都显示了一个漂亮而简洁的高级流程,说明 [简单] '如果 JWT 被验证,则资源被发送到客户端'。
您能否就所有这些基于令牌的身份验证内容应该如何在低级别工作(即,为了请求安全资源)提供一些指导?
谢谢,
科迪
【问题讨论】:
【参考方案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希望这会有所帮助。
【讨论】:
这是一个巨大的帮助——感谢你们花时间如此彻底地回答。我只是对你的#3 和#5-b 很模糊。为什么客户需要我的 SECRET 以及为什么要使用 Cookie 来存储 SECRET?令牌不是用来消除 Cookie 的脆弱性吗?使用客户端 SECRET 不会是一种风险和不必要的,还是后者只是用于解码非常敏感和必要的数据,例如 SSN?非常感谢。 另外,在#2 中,这是假设我的“当前方法”部分正确吗?鉴于,#2 建议雇用ORM.findOne( req.user.userId, ... )
... 对吗?我应该使用req.middleware.user.id
/ jwt.sub
将安全资源映射到适当的用户?
不,您的密钥不应该被共享,并且对于 Web 应用程序,将令牌存储在 cookie 中而不是密钥
您的客户不应该解密您的令牌,他需要做的就是在每个请求中向您发送令牌。所以永远不要分享你的密钥
完美,再次感谢。我会接受你的回答,因为这一切都让我在最需要的地方得到了最大的帮助。以上是关于休息 |智威汤逊 | Auth:如何验证安全资源的权限的主要内容,如果未能解决你的问题,请参考以下文章