如何从java中的刷新令牌中重新构建keycloft用户令牌



由于我们产品的体系结构,我使用的负载均衡器无法正确管理我的服务器。为了解决这一点,我创建了一种管理器,当需要时,通过直接从第一台服务器请求,将调用转发到正确的服务器。问题是,我在第二个调用的头中转发用户密钥斗篷令牌字符串。它工作得很好,但几分钟后令牌就失效了。我试图通过多种方式刷新它,但没有成功。我有两个约束条件。我无法将凭据重新分配给用户,也无法使用密钥斗篷秘密,因为我在一个多租户/多领域应用程序中工作。你知道吗?

我假设您在登录时只有access_token。

  1. 首先,您需要将该访问令牌交换为刷新令牌(和另一个访问令牌(,您可以通过调用:
HTTP POST {{host}}/auth/realms/{{realm}}/protocol/openid-connect/token
HEADERS:
Content-Type: application/x-www-form-urlencoded
BODY:
grant_type: urn:ietf:params:oauth:grant-type:token-exchange
subject_token: the_user_access_token
client_id: your_client_id (in my case this is "public")
requested_token_type: urn:ietf:params:oauth:token-type:refresh_token
  1. 您将返回如下响应:
{
"access_token": "access_token_value",
"expires_in": access_token_time_in_seconds,
"refresh_expires_in": refresh_token_time_in_seconds,
"refresh_token": "refresh_token_value",
"token_type": "bearer",
...
}
  1. 因此,您可以通过以下请求实际刷新令牌:
HTTP POST {{host}}/auth/realms/{{realm}}/protocol/openid-connect/token
HEADERS:
Content-Type: application/x-www-form-urlencoded
BODY:
grant_type: refresh_token
refresh_token: refresh_token_value
client_id: public
  1. 这将得到以下响应:
{
"access_token": "access_token_value",
"expires_in": access_token_time_in_seconds,
"refresh_expires_in": refresh_token_time_in_seconds,
"refresh_token": "refresh_token_value",
"token_type": "bearer",
...
}

现在,您可以重复步骤3和4,直到达到最大会话持续时间。

相关内容

  • 没有找到相关文章

最新更新