通过 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
如何通过ID获取其他用户信息(用户名,名字)? [Keycloak]