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

Updating jwt scope in token after it has been signed

令牌创建于:

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

这 return 是一个带有范围选项的签名 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 会将范围与初始范围列表和 return 刷新令牌进行比较如果匹配。

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

我是否可以在不注销的情况下将 p6 添加到作用域中?

编辑:

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

经过大量挖掘答案和解决方案后,如果不注销,则根本无法满足要求。正如文档所述

scope (optional)

The requested scope must not include additional scopes that were not issued in the original access token. Typically this will not be included in the request, and if omitted, the service should issue an access token with the same scope as was previously issued.

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

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

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