OAuth2:使用 JWT 客户端身份验证的 JWT 授权授予和客户端凭据授予之间有什么区别?
OAuth2: What is the difference between the JWT Authorization Grant and Client Credentials Grant with JWT client authentication?
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]
对
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]
可能很少。识别客户端的方式和请求授权授权的方式是 OAuth 中的两个不同概念,因此问题分别针对这些概念:
- 客户端可以使用 JWT 向授权服务器进行身份验证吗?是的
- 客户端可以使用 JWT 提出授权请求吗?是的
规范似乎暗示分离只是一个设计决策,让政策制定者去寻找对他们有价值的场景:
The use of a security token for client authentication is orthogonal to and separable from using a security token as an authorization grant. They can be used either in combination or separately. Client authentication using a JWT is nothing more than an alternative way for a client to authenticate to the token endpoint and must be used in conjunction with some grant type to form a complete and meaningful protocol request. JWT authorization grants may be used with or without client authentication or identification. Whether or not client authentication is needed in conjunction with a JWT authorization grant, as well as the supported types of client authentication, are policy decisions at the discretion of the authorization server.
一个具体的可能性:分离可以允许授权服务器根据客户端类型设置不同的策略。例如,在 public 客户端(如移动应用程序)的情况下,服务器不应接受客户端信用授权类型。相反,服务器可以接受 public 客户端的 JWT 授权类型,并发出权限较低的令牌。
除此之外,我认为该设计只是为客户端和服务器提供了一定程度的自由旋转——保持现有握手的这一部分不变,同时根据需要迁移这一部分。
对 Josh C 的出色回答的看法略有不同:碰巧客户端身份验证和授权凭据都可以表示为 JWT,但它们背后的语义不同。
这是关于关注点的分离:客户端使用 识别它们的凭据进行身份验证 即它们是所谓的 subject
而它们使用颁发的授权 他们即所谓的audience
。或者作为规范草案的第 12 版 (https://datatracker.ietf.org/doc/html/draft-ietf-oauth-jwt-bearer-12) 说:
The JWT MUST contain a "sub" (subject) claim identifying the
principal that is the subject of the JWT. Two cases need to be
differentiated:
A. For the authorization grant, the subject typically
identifies an authorized accessor for which the access token
is being requested (i.e., the resource owner or an
authorized delegate), but in some cases, may be a
pseudonymous identifier or other value denoting an anonymous
user.
B. For client authentication, the subject MUST be the
"client_id" of the OAuth client.
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]
对
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]
可能很少。识别客户端的方式和请求授权授权的方式是 OAuth 中的两个不同概念,因此问题分别针对这些概念:
- 客户端可以使用 JWT 向授权服务器进行身份验证吗?是的
- 客户端可以使用 JWT 提出授权请求吗?是的
规范似乎暗示分离只是一个设计决策,让政策制定者去寻找对他们有价值的场景:
The use of a security token for client authentication is orthogonal to and separable from using a security token as an authorization grant. They can be used either in combination or separately. Client authentication using a JWT is nothing more than an alternative way for a client to authenticate to the token endpoint and must be used in conjunction with some grant type to form a complete and meaningful protocol request. JWT authorization grants may be used with or without client authentication or identification. Whether or not client authentication is needed in conjunction with a JWT authorization grant, as well as the supported types of client authentication, are policy decisions at the discretion of the authorization server.
一个具体的可能性:分离可以允许授权服务器根据客户端类型设置不同的策略。例如,在 public 客户端(如移动应用程序)的情况下,服务器不应接受客户端信用授权类型。相反,服务器可以接受 public 客户端的 JWT 授权类型,并发出权限较低的令牌。
除此之外,我认为该设计只是为客户端和服务器提供了一定程度的自由旋转——保持现有握手的这一部分不变,同时根据需要迁移这一部分。
对 Josh C 的出色回答的看法略有不同:碰巧客户端身份验证和授权凭据都可以表示为 JWT,但它们背后的语义不同。
这是关于关注点的分离:客户端使用 识别它们的凭据进行身份验证 即它们是所谓的 subject
而它们使用颁发的授权 他们即所谓的audience
。或者作为规范草案的第 12 版 (https://datatracker.ietf.org/doc/html/draft-ietf-oauth-jwt-bearer-12) 说:
The JWT MUST contain a "sub" (subject) claim identifying the principal that is the subject of the JWT. Two cases need to be differentiated:
A. For the authorization grant, the subject typically identifies an authorized accessor for which the access token is being requested (i.e., the resource owner or an authorized delegate), but in some cases, may be a pseudonymous identifier or other value denoting an anonymous user.
B. For client authentication, the subject MUST be the "client_id" of the OAuth client.