签名后更新令牌中的 jwt 范围

Posted

技术标签:

【中文标题】签名后更新令牌中的 jwt 范围【英文标题】:Updating jwt scope in token after it has been signed 【发布时间】:2020-09-24 18:20:59 【问题描述】:

令牌是通过以下方式创建的:

"oauth": 
    "client_id": "...",
    "redirect_uri": "...",
    "scope": "p1 p2 p3 p4 p5",
    "state": "...",
    "code_challenge": "...",
    "code_challenge_method": "..."
  

这将返回一个带有范围选项的签名 jwt 令牌。

我想用声明中的“selected_person”更新签名的 jwt,比如 p1,所以我调用刷新令牌 url 传递刷新令牌和范围“p1”,在后端执行一些逻辑并设置人员ID。然后将人员 ID 添加到新签名的令牌中,一切都很好:

eg. /token?client_id=x&grant_type=y&refresh_token=y&scope=p1

可以使用首先定义的任何范围(p1、p2 等)调用相同的端点,因为 Spring 会将范围与初始范围列表进行比较,如果匹配则返回刷新令牌。

当一个新人与我联系时就会出现问题,所以现在我将拥有 p6。由于每个刷新令牌调用都基于第一个列表,因此 p6 不存在并且不会被允许。如果我注销并获取新令牌,则 p6 将添加到范围中。

无论如何我可以在不注销的情况下将 p6 添加到范围吗?

编辑:

最终有没有办法更新最初授予的范围?

【问题讨论】:

【参考方案1】:

@dale 您可以尝试一种稍微不同的方法,在该方法中保存到范围的内部映射。但是您必须接受首字母范围作为组。但是,您尝试实现的目标将无法实现,原因有两个。

    您正在尝试更改已签名的文档,这将使文档 (JWT) 无效。但这并不重要,因为它仅供您使用。 如果后续 API 调用链接到授权范围,则这些调用不会为您验证。

【讨论】:

是的,我已经走上了内部范围的路线,谢谢【参考方案2】:

在大量挖掘答案和解决方案之后,如果不注销,就无法满足要求。正如文件所指示的那样

范围(可选)

请求的范围不得包括其他 未在原始访问令牌中发布的范围。通常 这不会包含在请求中,如果省略,服务 应该发出与以前相同范围的访问令牌 发布。

参考:https://www.oauth.com/oauth2-servers/access-tokens/refreshing-access-tokens/

【讨论】:

以上是关于签名后更新令牌中的 jwt 范围的主要内容,如果未能解决你的问题,请参考以下文章

ClaimsIdentity缺少JWT令牌中的范围声明?

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

尝试使用 Google Drive API 的错误 JWT 签名

如何让我的 Auth0 权限进入 AWS HTTP API Jwt 授权方的访问令牌的范围声明?

JWT 身份验证方案中的刷新令牌是不是应该使用与访问令牌不同的秘密进行签名?

更新存储在 jwt 有效负载中的字段