oauth2.0 OpenIDConnect响应类型混淆

du7egjpx  于 2023-10-15  发布在  其他
关注(0)|答案(4)|浏览(107)

在过去的几天里,我阅读了关于OAuth2和OpenIDConnect的所有规范,并使用Thinktecture Identity Server实现了一个测试客户端。我也参加了几个多视觉课程,我想我理解它的主要要点。然而,我仍然非常困惑的React类型。
OpenIDConnect规范指定混合流响应类型是“code”、“id_token”和“token”的组合。我理解“id_token”允许我们最初访问基本的ID信息。
我也理解“代码”指的是授权代码,“令牌”指的是访问令牌,将“代码”与其他两个中的一个或两个组合会触发流程,但我的理解是,您在授权流程中将授权代码交换为访问令牌,而隐式流程隐式提供访问代码?
有人能帮我理清头绪吗?

qyswt5oh

qyswt5oh1#

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

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

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

  • 授权流程一词并不完全正确;它的正式名称是授权代码流
  • 术语访问代码不存在
  • 隐式流没有授权代码(也没有访问代码),事实上根本没有涉及允许客户端从令牌端点获取令牌的凭据(或 grant),因此它的名称

正如@juanifioren指出的那样,混合流将合并的东西结合在一起:

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

从Token端点获取access_token与从Authorization端点获取access_token不同,因为机密客户端向Token端点(而不是向Authorization端点)进行身份验证。因此,用于客户端机密部分的access_token可能具有更多权限和/或更长的寿命。
另请参阅规范邮件列表中关于此主题的简短帖子:http://lists.openid.net/pipermail/openid-specs-ab/Week-of-Mon-20150209/005229.html

jbose2ul

jbose2ul2#

要了解响应类型和授权类型之间的可能关系,请参见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 }
        };
yks3o0rb

yks3o0rb3#

你对授权代码流和隐式流的想法是正确的。但我认为你把混合流弄得太复杂了。当你使用hybrid的时候,你可以简单地同时得到code和id_token。
之后,您可以抓取代码并将其交换为访问令牌,或者直接使用id_token(或访问令牌)。这两种方法都有自己的缺陷,特别是在安全性方面。

vhmi4jdf

vhmi4jdf4#

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

6. response_type=code token

当response_type的值为code token时,从授权端点发出授权码和访问令牌,从令牌端点发出访问令牌。此外,如果openid包含在scope请求参数中,则也会从令牌端点发出ID令牌。
授权端点和令牌端点都会发出访问令牌,但访问令牌的内容并不总是相同的。对此,“3.3.3.8. OpenID Connect Core 1.0中的“Access Token”如下:
如果从授权端点和令牌端点返回访问令牌,这是response_type值code token和code id_token token的情况,它们的值可能相同或不同。请注意,由于两个端点的安全特性不同,可能会返回不同的访问令牌,并且它们授予的生存期和对资源的访问权限也可能不同。

相关问题