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
流程将直接在身份验证响应中获得 code
和 id_token
,但您将使用 code
获得 access_token
来自令牌端点
code token
流程将直接在身份验证响应中获得 code
和 access_token
,但您将使用 code
获得 id_token
可能还有另一个 access_token
来自 Token 端点 的后端
code id_token token
流程将在身份验证响应中直接获得 code
、access_token
和 id_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.
过去几天,我通读了所有关于 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
流程将直接在身份验证响应中获得code
和id_token
,但您将使用code
获得access_token
来自令牌端点code token
流程将直接在身份验证响应中获得code
和access_token
,但您将使用code
获得id_token
可能还有另一个access_token
来自 Token 端点 的后端
code id_token token
流程将在身份验证响应中直接获得code
、access_token
和id_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.