是否可以在 JWT 中包含 OAuth 范围?

Posted

技术标签:

【中文标题】是否可以在 JWT 中包含 OAuth 范围?【英文标题】:Is it OK to include the OAuth scopes inside a JWT? 【发布时间】:2019-03-30 20:35:42 【问题描述】:

我正在向现有应用程序添加 OAuth 授权服务器端点。我计划从 OAuth 令牌端点发出 JWT。

当为特定 OAuth 范围颁发令牌时,最好将为其颁发令牌的范围嵌入令牌本身,因为通过查看令牌更容易验证令牌是否有权执行特定操作令牌,当客户端稍后使用颁发的令牌执行某些操作时。

但是,JWT 的 standard claim fields 似乎没有包含合适的字段来标记 OAuth 范围。

那么,是否可以将范围作为自定义声明包含在 JWT 中?有没有其他方法可以在 JWT 中嵌入范围详细信息?

【问题讨论】:

简短回答:是的,没有什么能阻止您创建客户或服务器可以理解的自定义声明 @FlorentMorselli 由于 OAuth 在授权方面很突出,我希望 JWT 对 OAuth 有一些特殊的支持。请发表您的评论作为答案,以便我接受。 【参考方案1】:

JWT 规范 - RFC7519 使您能够插入和使用非标准/注册声明。这在规范的4.3. Private Claim Names 部分突出显示。

JWT 的生产者和消费者可以同意使用声明名称 是私有名称:不是注册声明名称的名称 (第 4.1 节)或公开声明名称(第 4.2 节)。与公共声明名称不同,私有声明名称容易发生冲突,并且应该 慎用。

此外,如果您需要标准注册索赔,可以在此处找到它们 - https://www.iana.org/assignments/jwt/jwt.xhtml

或者,如果您只对使用标准声明感兴趣并且仅将它们与 JWT 访问令牌一起使用(我假设您所指的 JWT 是访问令牌),那么您可以定义一个 token introspection endpoint 并将范围值放入其响应中。范围被定义为introspection response的标准响应参数

【讨论】:

【参考方案2】:

现在有很多人已经在实践中使用的JSON Web Token (JWT) Profile for OAuth 2.0 Access Tokens 草案(可能很快就会成为标准)。在2.2.2 部分中明确指出:

如果授权请求包含范围参数,则相应颁发的 JWT 访问令牌必须包含 [TokenExchange] 第 4.2 节中定义的范围声明。

范围声明中的所有单个范围字符串必须对 aud 声明中指示的资源有意义。

所以不仅允许scope 声明,如果请求有声明,它甚至是必需的。

【讨论】:

以上是关于是否可以在 JWT 中包含 OAuth 范围?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用用户和凭据(JWT)登录,而 Oauth2 可以使用 google 登录?

如果用于认证的JWT令牌保存在HTTP-Only cookie中,你如何从cookie中读取它,以便我可以在请求头中包含它?

如何在 React 中将 JWT 发送到后端?

对预检请求的响应未通过访问控制检查 - Angular 5 + JWT OAuth

将 JWT 与 Ktor 一起使用并在声明中包含用户信息

为啥在 JWT Token 中包含 Header 和 Payload?