具有预配置授权的 OAuth 安全性
Posted
技术标签:
【中文标题】具有预配置授权的 OAuth 安全性【英文标题】:OAuth Security with Pre-Configured Authorization 【发布时间】:2015-10-15 17:35:39 【问题描述】:我有一个场景,用户已登录到 Web 应用程序(使用 OpenID Connect 进行身份验证),然后需要从单独的 REST 服务访问数据。
REST 服务需要确定用户是否有权访问所请求的数据,但如果用户有权限,那么它应该授予 Web 应用程序授权,而不需要用户与 UI 交互。
基本上,我需要的是一个两足的 OAuth 解决方案,其中客户端/依赖方是完全信任的,但已经过身份验证的用户不是。
开始,我假设 OAuth 可以满足这些要求,但似乎没有一种授权类型符合要求:
授权码与我需要的相反,因为用户几乎是自动受信任的,但客户端不是,要求用户通过网络表单授予对客户端的访问权限。 Client Credentials 信任客户端(这是我需要的),但不给服务机会来确定用户是否有权访问资源(用户身份验证令牌不会传递给服务,使所有请求本质上是“匿名的”)。 ROPC(资源所有者密码凭据)似乎是唯一的选择,但需要 Web 应用程序知道并可能存储用户的登录凭据(这是站不住脚的)。这是 OAuth 中的一个缺口吗?还是我误解了这些赠款类型?如果 OAuth 不能支持这种情况,是否还有我错过的另一个被广泛采用的开放标准?
注意:我只拥有/控制 Web 应用程序,而客户(都是企业)拥有/控制身份验证服务器和 REST 服务。因此,一个共享的、非专有的标准是必要的,这样我们的客户将知道如何配置他们的服务(IBM、Microsoft 等),并且我会知道如何传递任何身份验证令牌等。
【问题讨论】:
你能画出相关各方的交互图吗?我认为我明白你想要做什么,但不能完全确定。 > "REST 服务需要确定用户是否有权访问请求的数据,但如果用户确实有权限,那么它应该授予 Web 应用程序授权而不需要用户与 UI 交互。”如果是这种情况,那么为什么不总是使用客户端凭据访问 API?为什么要先检查用户是否有访问权限? 【参考方案1】:我认为使用普通的 OAuth2 流程可以做到这一点。您的 Web 应用程序使用 code authorization grant 获取令牌以代表用户调用 API。
您的 Web 应用程序调用在 Authorization 标头中附加 JWT 令牌的 API。如果 REST 服务确定用户无权访问资源,则返回 401 Unauthorized HTTP 响应码。
您的 Web 应用程序通过返回授权服务器并使用 client credentials grant 获取访问令牌以代表客户端本身调用 REST API 来处理 401 响应。
由于这两种授权都允许您获取刷新令牌,因此您应该能够轻松地在访问令牌之间切换。
【讨论】:
如果我理解正确,使用授权码,客户端不会向授权服务器发送任何类型的客户端 ID/秘密。我想对客户端进行预授权,以便用户无需显式授予客户端代表他们访问服务的权限。那可能吗? (需要使用现有的标准——标准的自定义扩展会由于各种原因导致很多问题。) 使用授权码,客户端也会发送自己的凭据。但是令牌是代表用户调用你的服务。您始终可以使用客户端凭据授权来预先获取客户端的令牌。这行得通吗?【参考方案2】:如果 Web 应用程序和 REST 服务之间没有信任关系,则无法使用授权代码授权,因为无论如何都需要让用户参与以允许 Web 应用程序代表用户进行调用。
如果 Web 应用程序和 REST 服务之间存在信任关系,您应该能够使用常规 OpenID Connect 流在登录时获取 Web 应用程序的访问令牌,该令牌也可用于对 REST 服务的调用。
您可以将用户信息作为 JWT(即结构化)访问令牌的一部分传递,该令牌由 Web 应用程序本身或 OP 签名;这将符合 OAuth 2.0。请参阅https://www.rfc-editor.org/rfc/rfc6749#section-1.4 和May an OAuth 2.0 access token be a JWT?。
【讨论】:
如何在 Web 应用程序和 REST 服务之间建立信任关系?是否有一种标准方法可以将用户的身份验证令牌转发到 REST 服务,以便可以验证他们访问资源的权限? 您可以将用户信息作为 JWT(即结构化)访问令牌的一部分传递,该令牌由 Web 应用程序本身或 OP 签名;这将符合 OAuth 2.0 你能用那个建议更新你的帖子并指出一些权威参考吗? 我没有足够的时间在赏金到期之前验证您推荐的方法,所以我根据我对这个解决方案潜力的看法来授予它。如果它真的有效,我会回来接受答案。以上是关于具有预配置授权的 OAuth 安全性的主要内容,如果未能解决你的问题,请参考以下文章
Spring cloud微服务安全实战-4-4 OAuth2协议与微服务安全
配置多个 OAuth2 授权服务器和单个资源服务器之间的通信