通过 Keycloak 中的 refresh_token 刷新 access_token

Posted

技术标签:

【中文标题】通过 Keycloak 中的 refresh_token 刷新 access_token【英文标题】:Refresh access_token via refresh_token in Keycloak 【发布时间】:2018-12-25 10:45:27 【问题描述】:

如果用户的access_token 过期并且用户想要保持登录,我需要让用户保持登录。如何在Keycloak 上使用refresh_token 获得最新更新的access_token

我正在使用vertx-auth 进行身份验证,在vert.x 上使用Keycloak。是否可以使用vertx-auth 或Keycloak 的REST API 本身刷新access_token?或者这个的另一个实现是什么?

【问题讨论】:

【参考方案1】:

@maslick 是正确的,您也必须提供客户端密码,在这种情况下不需要授权标头:

http://localhost:8080/auth/realms/realm/protocol/openid-connect/token

如果刷新令牌过期,则返回:

如果您不添加密码,即使刷新令牌是正确的,您也会获得 401 未授权

【讨论】:

我刚刚测试过,如果颁发令牌的客户端是机密的,你只需要客户端机密【参考方案2】:

keycloak 具有 REST API,用于使用 refresh_token 创建 access_token。这是一个POST endpoint with application/x-www-form-urlencoded

这是它的外观:

Method: POST
URL: https://keycloak.example.com/auth/realms/myrealm/protocol/openid-connect/token
Body type: x-www-form-urlencoded
Form fields:    
client_id : <my-client-name>
grant_type : refresh_token
refresh_token: <my-refresh-token>

这将使用刷新令牌为您提供新的访问令牌。

注意:如果您的刷新令牌已过期,它将引发 400 异常,因为您可以让用户再次登录。

在 Postman 中查看一个示例,您可以使用它开发相应的 API。

【讨论】:

我用2.5.4 试过这个,它仍然需要这个请求的客户端密码。现在可以理解为什么在提供刷新令牌时需要客户端密码。 只有在 机密 客户端时才需要客户端密码。 公共客户端不需要客户端密码。 有人可以解释为什么在为机密客户端刷新令牌时需要客户端密码吗? @all ,为什么刷新token是jwt格式?无状态,但 google 和 auth0 使用有状态。 Keycloak 中的 @Kimble 机密客户端 用于服务器应用程序,其中存储客户端机密是安全的。看看文档(这里)[keycloak.org/docs/6.0/server_admin/#oidc-clients]【参考方案3】:

我尝试使用 4.8.2.Final,即使之前的访问令牌为“Bearer”,它也会提供以下unauthorized_client。 然后我尝试在 Authorization 标头中使用Basic YXBwLXByb3h5OnNlY3JldA==。 然后它起作用了,但我仍然不确定我做对了。

【讨论】:

对于授权标头,这一切都归结为服务器在标头值中查找的内容。如果这可行,那么您可能没有错。 您可能使用的是机密客户端,因此您需要在请求中包含client_secret 如果我必须为机密客户端传递 client_secret,为什么有人要使用刷新令牌? IMO,Keycloak 应该通过传递 client_id 和 refresh_token 来返回 access_token,因为它就像一个秘密。

以上是关于通过 Keycloak 中的 refresh_token 刷新 access_token的主要内容,如果未能解决你的问题,请参考以下文章

通过 Keycloak 中的 refresh_token 刷新 access_token

通过 2 个公共 URL 公开的 Keycloak 服务器

如何通过ID获取其他用户信息(用户名,名字)? [Keycloak]

Keycloak 中的多租户可以在一个领域内完成吗?

Spring Boot 中的 Keycloak 无法应用 Liquibase 补丁

如何在没有管理员帐户的情况下通过 REST 获取 Keycloak 用户