休息 |智威汤逊 | 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,我是否应该发送 idemail? 鉴于我应该有中间件来检查我的 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:如何验证安全资源的权限的主要内容,如果未能解决你的问题,请参考以下文章

Oauth2 Spring安全资源服务器和独立Auth服务器

独立休息服务的Spring Boot安全性[重复]

Spotify 智威汤逊流

nuxt/auth 如何真正安全?

访问此资源需要完全身份验证 - 休息 web 服务调用

护照和智威汤逊