我花了最近几天阅读有关OAuth2和OpenIDConnect的所有规范,并使用Thinktecture Identity Server实现测试客户端。我也遵循了几个复数课程,我认为理解它的主要要点。但是我仍然对响应类型非常困惑。
OpenIDConnect规范指定混合流响应类型是“code”,“id_token”和“token”的组合。我理解“id_token”允许我们最初访问基本的id信息。
我也理解代码“是指授权代码,而”令牌“是指访问令牌,并将”代码“与其他两个触发器中的一个或两个相结合,但我的理解是你交换授权代码授权流中的访问令牌,而隐式流隐式提供访问代码?
有人可以解决我的困惑吗?
答案 0 :(得分:15)
您所做的以下陈述是正确的:
code
是指授权码token
指的是访问令牌或(access_token
)code
access_token
但是你的一些困惑可能源于术语混淆:
正如@juanifioren所指出的,混合流动结合了一些东西:
code id_token
流将直接在身份验证响应中获得code
和id_token
,但您可以使用code
从access_token
获取code token
令牌端点code
流将直接在身份验证响应中获得access_token
和code
,但您可以使用id_token
获取access_token
并且可能来自令牌端点的后端中的另一个code id_token token
code
流将在身份验证响应中直接获得access_token
,id_token
和code
和您可以使用{{ 1}}在后端从令牌端点获取另一个 access_token
从令牌端点获取access_token
与从授权端点获取access_token
不同,因为机密客户端向Token端点(而不是授权端点)验证自身。因此,客户机密部分的{{1}}可能具有更多权限和更长的使用寿命。
另请参阅规范邮件列表中有关此主题的简短帖子:http://lists.openid.net/pipermail/openid-specs-ab/Week-of-Mon-20150209/005229.html
答案 1 :(得分:7)
要了解响应类型和授权类型之间的可能关系,请参阅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 }
};
答案 2 :(得分:0)
您对授权代码流和隐式流的想法是正确的。 但我认为你的混合流程过于复杂。使用hybrid时,你只需要获得代码和id_token。
之后,您可以获取代码并将其交换为访问令牌,或者直接使用id_token(或访问令牌)。这两种方法都有自己的缺陷,特别是在安全性方面。
答案 3 :(得分:0)
https://medium.com/@darutk/diagrams-of-all-the-openid-connect-flows-6968e3990660#9401
6。 response_type =代码令牌
当response_type的值为代码令牌时,为授权代码 和访问令牌从授权端点发出,并且 访问令牌是从令牌端点发出的。另外,如果openid 包含在范围请求参数中,从 令牌端点。
授权端点和令牌端点均发出访问权限 令牌,但访问令牌的内容并不总是相同。 关于此,“ 3.3.3.8。访问令牌”在OpenID Connect Core 1.0中 内容如下:
如果两个授权端点都返回了访问令牌 并且从令牌端点开始,这是response_type的情况 值代码令牌和代码id_token令牌,它们的值可以是 相同或不同。请注意,不同的访问令牌可能 由于不同的安全特性而被退回 两个端点,以及生命周期和对资源授予的访问权限 他们可能也不同。