【问题标题】:Keycloak admin REST API - create new access token with refresh token without recreating a refresh tokenKeycloak admin REST API - 使用刷新令牌创建新的访问令牌而不重新创建刷新令牌
【发布时间】:2022-01-21 22:48:57
【问题描述】:

当我拥有有效的刷新令牌时,我正在尝试使用 Keycloak 管理 REST API 重新创建访问令牌。

我通过使用 POST /auth/realms/{realm}/protocol/openid-connect/token 调用实现了这一点。

问题是端点每次也返回一个新的刷新令牌。这是 JWT 授权流程的工作方式吗?

我认为正确的流程是仅在调用 auth 端点时获取新的访问令牌,并且当刷新令牌过期时,再次登录以获取新的刷新令牌;不要在每次查询新的访问令牌时都获得新的刷新令牌。

我还阅读了this 堆栈溢出帖子。我在这里错过了什么吗? 您可能会在以下请求中找到一张图片:

【问题讨论】:

    标签: keycloak access-token refresh-token


    【解决方案1】:

    使用一次性刷新令牌是一种现代最佳实践,因为如果相同的刷新令牌被使用两次,授权服务器就可以踢出用户。

    怎么会这样?例如,如果刷新令牌被盗,那么黑客和您的应用程序都会尝试使用它!否则在系统中检测黑客有点困难

    【讨论】:

      【解决方案2】:

      首先你混淆了两件事。 使用 JWT 和 Oauth 授权令牌和刷新令牌开放 ID Connect 身份验证。

      这是两个不同的对象。 每次获得访问令牌时,您都会获得一个新的 OAuth 刷新令牌。这是 OAuth 授予您“无限会话”的方式,但可以选择在任何尝试交换时拒绝新的访问令牌。

      另见 RFC https://datatracker.ietf.org/doc/html/rfc6749#section-1.5

        +--------+                                           +---------------+
        |        |--(A)------- Authorization Grant --------->|               |
        |        |                                           |               |
        |        |<-(B)----------- Access Token -------------|               |
        |        |               & Refresh Token             |               |
        |        |                                           |               |
        |        |                            +----------+   |               |
        |        |--(C)---- Access Token ---->|          |   |               |
        |        |                            |          |   |               |
        |        |<-(D)- Protected Resource --| Resource |   | Authorization |
        | Client |                            |  Server  |   |     Server    |
        |        |--(E)---- Access Token ---->|          |   |               |
        |        |                            |          |   |               |
        |        |<-(F)- Invalid Token Error -|          |   |               |
        |        |                            +----------+   |               |
        |        |                                           |               |
        |        |--(G)----------- Refresh Token ----------->|               |
        |        |                                           |               |
        |        |<-(H)----------- Access Token -------------|               |
        +--------+           & Optional Refresh Token        +---------------+
      
                     Figure 2: Refreshing an Expired Access Token
      

      【讨论】:

      • 非常感谢您的回复!您能否澄清一下 keycloak 是否有一个选项,以避免在查询访问令牌时返回刷新令牌,以便强制注销?或者我们应该避免在后续调用我们使用 keycloak 的身份验证服务的消费者时返回新的刷新令牌?换句话说,问题是:我们如何使刷新令牌的返回成为可选的 - 通过 keycloak 选项或通过我们的实现?
      猜你喜欢
      • 1970-01-01
      • 2016-06-15
      • 2019-06-29
      • 2020-07-12
      • 2021-01-22
      • 2022-10-31
      • 1970-01-01
      • 2016-09-12
      • 2019-04-21
      相关资源
      最近更新 更多