在 Keycloak 中通过 refresh_token 刷新 access_token

Refresh access_token via refresh_token in Keycloak

如果用户的 access_token 过期并且用户想保持登录状态,我需要让用户在系统中保持登录状态。如何通过在 Keycloak 上使用 refresh_token 来更新 access_token

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

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。

我尝试使用 4.8.2.Final,它给出以下 unauthorized_client,即使之前的访问令牌为 'Bearer'。 然后我在授权 header 中尝试使用 Basic YXBwLXByb3h5OnNlY3JldA==。 然后它起作用了,但我仍然不确定我做的是对的。

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

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

如果刷新令牌过期 returns:

如果您不添加密码,即使刷新令牌正确,也会收到 401 未经授权

扩展 Yogendra Mishra 的回答。注意 client_idclient_secret也可以在授权header中发送。

Authorization: Basic ${Base64(<client_id>:<client_secret>)}

这适用于初始令牌调用(没有刷新令牌)和对 /openid-connect/token 端点

的刷新令牌调用

参考: https://developer.okta.com/docs/reference/api/oidc/#client-secret