当前位置: 首页 > 知识库问答 >
问题:

OAuth2:使用JWT客户端身份验证,JWT授权授权和客户端凭据授权之间有什么区别?

蒋原
2023-03-14

OAuth2 JWT 配置文件引入了将 JWT 用作授权授予和客户端身份验证的可能性。

JWT客户端身份验证功能独立于特定的授权类型,并且可以与任何授权类型一起使用,也可以与客户端凭据授权一起使用。

但是,使用 JWT 授权类型似乎与将客户端凭据授予与 JWT 客户端身份验证结合使用完全相同,只是语法略有不同。

在这两种情况下,客户端都会联系令牌终结点以获取访问令牌:

POST /token.oauth2 HTTP/1.1
Host: as.example.com
Content-Type: application/x-www-form-urlencoded

grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=[JWT]

vs

POST /token.oauth2 HTTP/1.1
Host: as.example.com
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials&client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer&client_assertion=[JWT]

共有2个答案

柯曜文
2023-03-14

可能很少。在 OAuth 中,识别客户端的方式和请求身份验证授权的方式是两个不同的概念,因此这些问题分别解决了这些概念:

  • 客户端是否可以使用 JWT 向授权服务器进行身份验证?是的。
  • 客户可以使用 JWT 提出授权请求吗?是的。

该规范似乎暗示,分离只是一个设计决定,由决策者来寻找对他们有价值的情景:

使用安全令牌进行客户端身份验证与使用安全令牌作为授权授权是正交的,也是可分离的。它们可以组合使用,也可以单独使用。使用JWT的客户端身份验证只是客户端向令牌endpoint进行身份验证的一种替代方式,必须与某些授权类型结合使用,才能形成完整且有意义的协议请求。JWT授权授权可以与或不与客户端认证或标识一起使用。是否需要结合JWT授权授权进行客户端身份验证,以及支持的客户端身份验证类型,由授权服务器自行决定。

一种具体的可能性是:分离可能允许授权服务器根据客户端类型设置不同的策略。例如,对于公共客户端(如移动应用程序),服务器不应接受客户端 creds 授权类型。相反,服务器可以接受公共客户端的 JWT 授权类型,并颁发权限较低的令牌。

除此之外,我认为该设计只是为客户机和服务器提供了一定程度的自由度,以便在需要时进行切换——在迁移该部分时保持现有握手的这一部分不变。

季嘉良
2023-03-14

对Josh C的伟大回答有一个稍微不同的观点:碰巧客户端身份验证和授权凭据都可以表示为JWT,但它们背后的语义学是不同的。

这是关于关注点的分离:客户使用标识他们的凭证进行认证,即他们是所谓的主题,而他们使用的是颁发给他们的授权,即他们就是所谓的受众。或作为规范草案的第12版(https://datatracker.ietf.org/doc/html/draft-ietf-oauth-jwt-bearer-12)说:

JWT 必须包含一个“子”(主题)声明,标识作为 JWT 主体的主体。需要区分两种情况:

一个。对于授权授予,使用者通常标识要为其请求访问令牌的授权访问者(即资源所有者或授权委托),但在某些情况下,可以是假名标识符或表示匿名用户的其他值。

B.对于客户端身份验证,使用者必须是 OAuth 客户端的“client_id”。

 类似资料:
  • 我们使用keycloak-adapter与Jetty一起使用KeyCloak进行身份验证和授权。根据OIDC Auth流程的Keycloak文档: 我们有连接到Jetty并使用Auth的webapps。因此,我们创建了一个公共客户端,它对WebApp/REST身份验证非常有效。 问题是,一旦我们启用授权,客户端类型就会从公共类型转换为机密类型,并且不允许将其重置为公共类型。现在,我们在汤里。由于授

  • 我正在编写一个类,用于创建对BigQuery和Google云存储的授权。 在过去,我曾使用,但已被弃用。我试图使用,但我发现它只允许我使用,而我需要。 我知道可以从转换为,但我不知道如何将它们转换成相反的方向(转换为)。例如,我像这样创建连接: 有人能给我指明如何实现这一目标的方向吗? 谢谢!

  • 直截了当的问题,希望有一个直截了当的答案。我试图使用request通过Node.js实现客户端凭证流。这是我的代码 无论我做什么,响应体总是 我尝试过使用 curl 提出请求,结果相同。 这意味着这是凭据的问题。我肯定为我的应用程序使用了正确的客户端ID和客户端秘密,这让我相信是编码导致了问题。 我的编码正确吗?如果是这样,还有什么原因呢?

  • 问题内容: 我正在编写用于创建BigQuery和Google Cloud Storage授权的类。 在过去,我已经使用已被 弃用 。我正在尝试使用,但是我发现它只允许在需要使用时使用。 我知道一个可以转换到,但我不知道如何将它们转换成相反的方向(到)。例如,我正在这样创建我的连接: 谁能指出我的实现方向? 谢谢! 问题答案: 在大多数情况下,无论您在哪里使用,都可以使用。您只需要使用一点,那就是在

  • 我想写一个应用程序,允许与数据交互的两种RESTful形式;常规REST CRUDendpoint和Web-UI。 过去,我在JS中实现了UI的大部分功能,这将调用常规的RESTendpoint。这很好,但对于这个应用程序,我想使用Qute来执行生成页面内容的大部分基本功能。但是,为了正确地管理endpoint并确保正确的RBAC控制,我需要通过cookie而不是普通的头来访问JWT。这似乎是可能