可以将OAuth 2.0访问令牌作为JWT吗?

bjm*_*jmc 21 oauth access-token oauth-2.0 jwt

据我所知,OAuth 2.0规范access token应采取的形式方面非常模糊:

令牌可以表示用于检索授权信息的标识符,或者可以以可验证的方式自包含授权信息(即,由一些数据和签名组成的令牌串).可能需要额外的身份验证凭据(超出本规范的范围),以便客户端使用令牌.

访问令牌提供抽象层,用资源服务器理解的单个令牌替换不同的授权构造(例如,用户名和密码).这种抽象使得发布访问令牌比用于获取它们的授权授权更具限制性,并且消除了资源服务器理解各种身份验证方法的需要.

访问令牌可以具有基于资源服务器安全性要求的不同格式,结构和利用方法(例如,加密属性). 访问令牌属性和用于访问受保护资源的方法超出了本规范的范围,并由协议规范(如RFC6750)定义.

(重点补充)

链接的RFC6750没有提供更多的进一步特异性.有一个示例HTTP响应正文显示:

{
       "access_token":"mF_9.B5f-4.1JqM",
       "token_type":"Bearer",
       "expires_in":3600,
       "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA"
     }
Run Code Online (Sandbox Code Playgroud)

这似乎表明access_token可以是不透明的ASCII文本,例如编码的JSON Web令牌(JWT)

从我的角度来看,似乎JWT-as-access_token具有一些理想的属性:

  • 它是一个已知的规范,具有相当广泛的采用和许多语言的客户端库.

  • 它允许使用经过审查的加密库轻松签名和验证.

  • 因为它可以解码为JSON,所以它允许我们在令牌本身中包含有关令牌的元数据和信息.

我的问题是:首先,允许访问令牌是JWT吗?其次,如果根据规范是允许的,那么使用JWT作为访问令牌会有什么额外的考虑因素吗?

Han*_* Z. 26

A1:完全允许使用JWT作为访问令牌,因为规范不限制其格式.

A2:使用JWT作为访问令牌的想法是它可以是自包含的,以便目标可以验证访问令牌并使用相关内容而无需返回授权服务器.这是一个伟大的财产,但使撤销更难.因此,如果您的系统需要立即撤销访问权限的功能,那么JWT可能不是访问令牌的正确选择(尽管您可以通过减少JWT的生命周期来获得相当大的优势).

  • 撤销的诀窍是使用刷新令牌.刷新令牌由授权服务器在您的JWT访问令牌的同时提供,但具有更长的生命周期,并且 - 至关重要的是 - 只能用于请求授权服务器获取新的访问令牌(无需用户交互) ).例如,AS发出持续5小时的刷新令牌和持续5分钟的访问JWT.没有缓慢的AS呼叫,你得到5分钟的请求,并且有机会每5分钟撤销一次(当访问令牌到期并且刷新令牌用于从AS请求新的令牌时) (5认同)
  • 如果您在发生灾难性事件时需要撤销访问权限,您可以直接更改秘密吗? (2认同)
  • 现在有一个带有令牌撤销端点的 RFC 扩展 OAuth2:https://tools.ietf.org/html/rfc7009 一周前发布的另一个用于令牌自省:https://tools.ietf.org/ html/rfc7662 (2认同)