OpenIDConnect 响应类型混淆

OpenIDConnect Response Type Confusion

过去几天,我通读了所有关于 OAuth2 和 OpenIDConnect 的规范,并使用 Thinktecture Identity Server 实现了一个测试客户端。我还参加了几个 pluralsight 课程,我认为了解它的主要要点。但是我仍然对响应类型感到非常困惑。

OpenIDConnect 规范指定混合流响应类型是 "code"、"id_token" 和 "token" 的组合。我了解 "id_token" 允许我们最初访问基本 ID 信息。

我也理解代码”是指授权代码,"token" 是指访问令牌,将 "code" 与其他两个中的一个或两个相结合会触发流程,但我的理解是你在授权流程中将授权代码交换为访问令牌,而隐式流程隐式提供访问代码?

有人能解开我的困惑吗?

您对授权代码流和隐式流的看法是正确的。 但是我认为您使混合流程过于复杂。使用 Hybrid 时,您只需同时获得代码和 id_token.

之后,您可以获取代码并将其交换为访问令牌,或者直接使用 id_token(或访问令牌)。这两种方法都有其自身的缺陷,尤其是在安全性方面。

您所做的以下陈述是正确的:

  • code指授权码
  • token 指访问令牌或 (access_token)
  • 在授权代码流程中,将 code 切换为 access_token

但您的部分困惑可能源于术语混淆:

  • 术语授权流程并不完全正确;它的正式名称是 Authorization Code flow
  • 术语访问代码不存在
  • 隐式流程没有授权代码(也没有访问代码),实际上根本没有涉及允许客户端从令牌端点,因此它的名称

正如@juanifioren 指出的那样,混合流结合了以下内容:

  • code id_token 流程将直接在身份验证响应中获得 codeid_token,但您将使用 code 获得 access_token来自令牌端点
  • code token 流程将直接在身份验证响应中获得 codeaccess_token,但您将使用 code 获得 id_token可能还有另一个 access_token 来自 Token 端点
  • 的后端
  • code id_token token 流程将在身份验证响应中直接获得 codeaccess_tokenid_token 您可以在后端使用 code 从 Token 端点
  • 获取 另一个 access_token

从令牌端点获取 access_token 不同于从授权端点获取它,因为机密客户端向令牌端点(而不是授权端点)验证自己。因此,客户端机密部分的 access_token 可能拥有更多权限或更长的生命周期。

另请参阅规范邮件列表中有关此主题的短帖:http://lists.openid.net/pipermail/openid-specs-ab/Week-of-Mon-20150209/005229.html

要了解响应类型和授权类型之间的可能关系,请参阅IdentityServer4\Constants.cs

public static readonly Dictionary<string, string> ResponseTypeToGrantTypeMapping = new Dictionary<string, string>
        {
            { OidcConstants.ResponseTypes.Code, GrantType.AuthorizationCode },
            { OidcConstants.ResponseTypes.Token, GrantType.Implicit },
            { OidcConstants.ResponseTypes.IdToken, GrantType.Implicit },
            { OidcConstants.ResponseTypes.IdTokenToken, GrantType.Implicit },
            { OidcConstants.ResponseTypes.CodeIdToken, GrantType.Hybrid },
            { OidcConstants.ResponseTypes.CodeToken, GrantType.Hybrid },
            { OidcConstants.ResponseTypes.CodeIdTokenToken, GrantType.Hybrid }
        };

https://medium.com/@darutk/diagrams-of-all-the-openid-connect-flows-6968e3990660#9401

6. response_type=code token

When the value of response_type is code token, an authorization code and an access token are issued from the authorization endpoint, and an access token is issued from the token endpoint. In addition, if openid is included in the scope request parameter, an ID token is issued from the token endpoint, too.

Both the authorization endpoint and the token endpoint issue an access token, but the contents of the access tokens are not always the same. Regarding this, “3.3.3.8. Access Token” in OpenID Connect Core 1.0 says as follows:

If an Access Token is returned from both the Authorization Endpoint and from the Token Endpoint, which is the case for the response_type values code token and code id_token token, their values MAY be the same or they MAY be different. Note that different Access Tokens might be returned be due to the different security characteristics of the two endpoints and the lifetimes and the access to resources granted by them might also be different.