身份验证和资源服务器之间的 OAuth v2 通信
Posted
技术标签:
【中文标题】身份验证和资源服务器之间的 OAuth v2 通信【英文标题】:OAuth v2 communication between authentication and resource server 【发布时间】:2011-09-09 10:50:38 【问题描述】:我在理解 OAUTH-v2 的工作原理时遇到了一些麻烦。
OAuth version 2 spec 内容如下:
访问受保护的资源
客户端访问受保护 通过提供访问权限来获取资源 到资源服务器的令牌。这 资源服务器必须验证 访问令牌并确保它没有 已过期且其范围涵盖 请求的资源。方法 资源服务器用于 验证访问令牌(以及 任何错误响应)都超出 本规范的范围,但 通常涉及互动或 资源之间的协调 服务器和授权 服务器。
资源服务器和授权服务器之间的这种交互在实践中是如何工作的?
资源服务器如何 确定它的访问令牌 收到的有效吗? 如何 资源服务器提取允许的 从令牌中查看是否应授予对特定资源的访问权限? Scope 是编码在访问令牌中,还是资源服务器必须先联系授权服务器? 资源服务器和授权服务器之间的信任是如何建立的?访问令牌属性和 用于访问受保护的方法 资源超出了本文的范围 规范,并由 配套规范。
有人可以举例说明令牌属性吗?
【问题讨论】:
这真的是我几天以来一直在寻找的问题 【参考方案1】:资源到授权服务器 API 的一个示例是 Google Developers Website。 虽然它没有指定访问令牌的格式,但响应似乎非常普遍有用。
【讨论】:
OIDC 和 id_tokens 与 obaque 访问令牌不同。【参考方案2】:这超出规范范围的原因是实现两个实体之间的这种连接的方法范围很广。主要问题是您的部署有多复杂。
例如,您是否有一个服务器来管理身份验证和访问,以及一组独立的服务,每个服务都有自己的服务器来服务 API 调用?或者,您是否只有一个带有一个 Web 服务器的盒子,它同时处理身份验证/授权和 API 调用?
在单个盒子的情况下,不需要太多,因为发行令牌的实体与验证它们的实体相同。您可以实现令牌以使用数据库表键并在每次请求时在数据库(或内存缓存)中查找记录,或者您可以将范围、用户 ID 和其他信息直接编码到令牌中并使用对称或非对称加密它算法。
在处理分布式环境时,事情会变得有点复杂,但不会复杂很多。您仍然在授权服务器上发布令牌,但资源服务器需要一种方法来验证这些令牌。它可以通过向资源服务器提供一个内部 API 来请求授权服务器“解析”令牌(这在本地环境中可以很快)来实现,或者两者可以建立公钥/私钥对或对称密钥并使用它将资源服务器需要的所有内容加密到令牌中。
自包含令牌更长,但每个请求的性能要好得多。然而,它们是有代价的——当它们仍然有效(未过期)时,你不能真正撤销它们。出于这个原因,自包含令牌应该是非常短暂的(无论您是否可以接受在被撤销后保持访问开放 - 例如许多网站使用一个小时),并且刷新令牌可以使用一年或更长时间以获得新令牌。
【讨论】:
如果发行和验证令牌的实体没有静态白色/公共 IP,那么服务提供商回调客户端/资源所有者无法通过 HTTP(s) 完成,因此需要更详细的处理,这是真的吗?实现? 回调不是由服务提供商执行的,而是由用户的浏览器执行的。不确定你在问什么。 如果你添加一些资源服务器使用的api(属于你的api)会发生什么。然后你应该使用oath2身份验证(client_credentials)与资源服务器建立安全的机器对机器通信吗?在这种情况下,这是否意味着所有 api 都必须与身份验证服务器共享相同的密钥对?以上是关于身份验证和资源服务器之间的 OAuth v2 通信的主要内容,如果未能解决你的问题,请参考以下文章
配置多个 OAuth2 授权服务器和单个资源服务器之间的通信
Spring OAuth2:支持 SSO 和自定义身份验证服务器的身份验证和资源访问
Spring Boot - 使用 JWT、OAuth 以及单独的资源和身份验证服务器
如何使用带有 DB 的 spring oauth2 实现资源服务器和身份验证服务器?
Spring OAuth - 重新加载资源ID和身份验证权限
Microsoft Graph PowerShell v2 发布公开预览版 - 新的身份验证方法,支持解除阻塞场景,脚本迁移工具