【发布时间】:2013-07-12 23:20:39
【问题描述】:
我很难问这个问题,所以让我向您解释一下我们半生不熟的 OAuth 2.0 解决方案:
目前,我们仅使用受信任的授权,而是要求提供用户名和密码。如果这些凭据成功通过身份验证,我们将发出访问令牌和刷新令牌。但是,该响应消息中没有范围信息。 OAuth2 规范说,如果在请求中提供了范围,那么它也需要在响应中返回,但前提是授予的范围与请求的范围不同。在任何情况下,我们都没有为令牌分配范围,只有一个表示用户已通过验证的令牌。这对我来说感觉不对,但也许我想多了。
稍后在我们的流程中,客户端将尝试访问受保护的资源,例如登录到仅授予特定角色的网站。因此,虽然您可能已通过身份验证(您拥有访问令牌),但由于您的角色,您可能无法登录此站点。我们当前验证这一点的方式是将访问令牌发送到资源端点。然后,该端点将令牌与您尝试访问的 uri 一起发送到我们的验证服务器,该服务器验证您的令牌是好的,并且您的角色(我们通过数据库中的令牌条目查找)允许您访问资源,然后返回 200 以允许您继续或 403 表示您无权访问该端点。所以换句话说,访问令牌没有直接分配给它的任何范围,它只是告诉我们你是谁,然后我们查找你的权限并将其与请求进行比较,然后说是或否。这对我来说似乎很奇怪。
在我见过的其他实现中,我的印象是它实际上应该像这样工作:
- 如果您的凭据成功验证,您将请求访问令牌 然后生成一个令牌。
- 然后,身份验证服务器查看您请求的范围,然后在数据库中生成一个令牌以及您的批准部分 请求的范围(部分或完整)。相反,如果您要求 a b c 和 d,但只有 b 和 d 获得批准,然后令牌存储在我们的 数据库将反映只允许使用 b 和 c 令牌。
- 令牌字符串连同批准的范围一起发送回客户端。
- 在受保护的资源请求期间,我们在数据库中查找令牌并将请求的资源与范围内的资源进行比较 输入提供的令牌,然后返回 yay 或 nay,而不是 查找用户权限。
那么有什么区别呢?我的印象是 TOKEN 包含范围。因此,如果用户 A 被允许资源 A B C D 和 E,但请求 B C 和 F,那么令牌将只对 B 和 C 有用。我们不简单地授予 A,因为他被允许这样做;他没有要求 A D 或 E 并且不允许他 F 所以令牌不允许他们。这有意义吗?
所以我的问题是这样的。根据我对它应该使用的方式的理解,我们当前的实现是否错误?我的理解正确吗?
【问题讨论】: