【问题标题】:Calling refresh_token doesn't refresh resource ids in token调用 refresh_token 不会刷新令牌中的资源 ID
【发布时间】:2017-03-08 14:53:59
【问题描述】:

流程是这样的:

  1. 我们有一个注册了特定资源 ID 的 oauth 应用,因此该应用可以访问这些资源
  2. 一段时间后,我们需要添加另一个资源 ID,因为我们正在扩展客户端应用的功能
  3. 客户端应用程序有时会刷新令牌,这可能是由于错误或 access_token 过期。
  4. 在新的 access_token 上使用 check_token 会为我们提供一组旧的资源 ID。似乎它取自某些缓存或旧令牌本身。

问题: 不应该刷新令牌刷新资源ID吗?这是反对 oauth rfc(在其中找不到有关此特殊情况的任何信息)吗?

我们当然可以撤销 oauth 应用程序的所有令牌,但这需要我们所有的用户重新登录,这是我们想要避免的。

我不确定它是否与 Spring Cloud 安全性或 oAuth 本身有关。 C

【问题讨论】:

    标签: spring oauth oauth-2.0 spring-oauth2 spring-cloud-security


    【解决方案1】:

    此答案假定您的资源标识符等同于 OAuth2 描述的范围,因为从您的描述来看,它们的目的似乎非常相似 - 限制访问令牌的范围。

    在发出访问令牌刷新请求时,规范声明您可以包含 scope 参数,但是:

    第 3.3 节所述的访问请求范围。 请求的范围不得包括资源所有者最初授予的任何范围,如果省略,则视为与资源所有者最初授予的范围相同。

    此外,作为响应的一部分,可以发出一个新的刷新令牌,但同样:

    授权服务器可以发出一个新的刷新令牌 (...) 如果发出一个新的刷新令牌,刷新令牌的范围必须与客户端在请求中包含的刷新令牌的范围相同。

    (重点是我的,section 6. of the specification

    这意味着,根据规范,向访问令牌自动添加新范围/资源是不合规的。但是,您无需注销用户,只需请求资源所有者同意新范围即可。

    同样,这就是规范中关于似乎与您的使用场景相匹配的范围的说明。但是,在某些情况下,这不会如此严格地适用,或者最终不会产生真正的影响。如果单个组织控制授权服务器和客户端应用程序,它可以决定某些应用程序享有有时称为管理同意的内容,这基本上是不要求资源所有者明确同意,因为这是一个受信任的应用程序。在这些情况下,您可以在没有任何类型的用户干预的情况下增加范围/资源。

    【讨论】:

    • 这里的资源只是用户在登录后可以访问的应用程序(受 oauth2 保护)。据我了解范围 - 它们为用户提供了这些应用程序将代表他使用哪些个人数据的线索。我不想在初步批准后在他们背后获取一些数据,我只想为用户添加更多功能以与应用交互。
    • 如果您的资源不代表与用户关联的实际数据,您是否将它们包含在令牌中,以便在处理令牌时不必从其他地方查询它们?如果是这样,我会考虑将它们移到令牌本身之外。
    猜你喜欢
    • 2021-05-17
    • 2016-11-22
    • 2020-10-01
    • 2020-12-26
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 2018-06-08
    相关资源
    最近更新 更多