OAuth 2.0 访问令牌可以是 JWT 吗?
May an OAuth 2.0 access token be a JWT?
据我所知,the OAuth 2.0 specification 在 access token
应该采用什么形式方面非常模糊:
The token may denote an identifier used to retrieve the authorization
information or may self-contain the authorization information in a verifiable manner (i.e., a token string consisting of some data and a signature). Additional authentication credentials, which are beyond the scope of this specification, may be required in order for the client to use a token.
The access token provides an abstraction layer, replacing different authorization constructs (e.g., username and password) with a single token understood by the resource server. This abstraction enables issuing access tokens more restrictive than the authorization grant used to obtain them, as well as removing the resource server's need to understand a wide range of authentication methods.
Access tokens can have different formats, structures, and methods of utilization (e.g., cryptographic properties) based on the resource server security requirements. Access token attributes and the methods used to access protected resources are beyond the scope of this specification and are defined by companion specifications such as RFC6750.
(强调)
链接的 RFC6750 没有提供更多的具体信息。有一个示例 HTTP 响应正文显示:
{
"access_token":"mF_9.B5f-4.1JqM",
"token_type":"Bearer",
"expires_in":3600,
"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA"
}
这似乎表明 access_token 可以是不透明的 ASCII 文本,例如编码的 JSON Web Token (JWT)
从我的角度来看,JWT-as-access_token 似乎具有一些理想的属性:
这是一个已知的规范,具有相当广泛的采用和多种语言的客户端库。
它允许使用经过审查的加密库轻松签名和验证。
因为它可以被解码为 JSON,它允许我们在令牌本身中包含关于令牌的元数据和信息。
我的问题是:首先,访问令牌可以是 JWT 吗?其次,如果根据规范允许,是否有任何其他考虑因素会使使用 JWT 作为访问令牌成为一个坏主意?
只要授权服务器和资源服务器就访问令牌的含义达成一致,它们的内容是什么并不重要。因此,您可能遇到问题的唯一原因是,如果您在实施这两个服务器时使用了不同的库或框架。
A1:规范当然允许使用 JWT 作为访问令牌,因为规范不限制其格式。
A2:使用 JWT 作为访问令牌背后的想法是,它可以是自包含的,这样目标就可以验证访问令牌并使用关联的内容,而无需返回到授权服务器。这是一个很好的 属性 但会使撤销变得更加困难。因此,如果您的系统需要立即撤销访问权限的功能,那么 JWT 可能不是访问令牌的正确选择(尽管您可以通过缩短 JWT 的生命周期来取得很大进展)。
目前 OAuth 工作组正在为 OAuth 2.0 访问令牌开发 JWT 配置文件:JSON Web Token (JWT) Profile for OAuth 2.0 Access Tokens
据我所知,the OAuth 2.0 specification 在 access token
应该采用什么形式方面非常模糊:
The token may denote an identifier used to retrieve the authorization information or may self-contain the authorization information in a verifiable manner (i.e., a token string consisting of some data and a signature). Additional authentication credentials, which are beyond the scope of this specification, may be required in order for the client to use a token.
The access token provides an abstraction layer, replacing different authorization constructs (e.g., username and password) with a single token understood by the resource server. This abstraction enables issuing access tokens more restrictive than the authorization grant used to obtain them, as well as removing the resource server's need to understand a wide range of authentication methods.
Access tokens can have different formats, structures, and methods of utilization (e.g., cryptographic properties) based on the resource server security requirements. Access token attributes and the methods used to access protected resources are beyond the scope of this specification and are defined by companion specifications such as RFC6750.
(强调)
链接的 RFC6750 没有提供更多的具体信息。有一个示例 HTTP 响应正文显示:
{
"access_token":"mF_9.B5f-4.1JqM",
"token_type":"Bearer",
"expires_in":3600,
"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA"
}
这似乎表明 access_token 可以是不透明的 ASCII 文本,例如编码的 JSON Web Token (JWT)
从我的角度来看,JWT-as-access_token 似乎具有一些理想的属性:
这是一个已知的规范,具有相当广泛的采用和多种语言的客户端库。
它允许使用经过审查的加密库轻松签名和验证。
因为它可以被解码为 JSON,它允许我们在令牌本身中包含关于令牌的元数据和信息。
我的问题是:首先,访问令牌可以是 JWT 吗?其次,如果根据规范允许,是否有任何其他考虑因素会使使用 JWT 作为访问令牌成为一个坏主意?
只要授权服务器和资源服务器就访问令牌的含义达成一致,它们的内容是什么并不重要。因此,您可能遇到问题的唯一原因是,如果您在实施这两个服务器时使用了不同的库或框架。
A1:规范当然允许使用 JWT 作为访问令牌,因为规范不限制其格式。
A2:使用 JWT 作为访问令牌背后的想法是,它可以是自包含的,这样目标就可以验证访问令牌并使用关联的内容,而无需返回到授权服务器。这是一个很好的 属性 但会使撤销变得更加困难。因此,如果您的系统需要立即撤销访问权限的功能,那么 JWT 可能不是访问令牌的正确选择(尽管您可以通过缩短 JWT 的生命周期来取得很大进展)。
目前 OAuth 工作组正在为 OAuth 2.0 访问令牌开发 JWT 配置文件:JSON Web Token (JWT) Profile for OAuth 2.0 Access Tokens