想象一下,
以下是 Keyclock 中的 2 个客户端(2 个微服务)。
- rest-service-1
- rest-service-2
以下是 rest-service-2 中的角色
- service-2-user
进行服务之间的调用,即:rest-service-1 调用 rest-service-2
'rest-service-1' 在 Keycloak 中配置有以下值
Access Type: confidential
Service Account Enabled: Yes
此外,在'rest-service-1'的“服务帐户角色”下,已添加/映射以下角色
Role for client rest-service-2: service-2-user
在为Keycloak调用客户端设置了2个客户端和服务帐户后,我创建了一个Spring Boot 2.0.3项目,并使用以下代码获取令牌。
@Bean
public AuthzClient authzClient(KeycloakSpringBootProperties kcProperties) {
//org.keycloak.authorization.client.Configuration
Configuration configuration =
new Configuration(kcProperties.getAuthServerUrl(),
kcProperties.getRealm(),
kcProperties.getResource(),
kcProperties.getCredentials(), null);
return AuthzClient.create(configuration);
}
这是我获取访问令牌的方法
@Autowired
private AuthzClient authzClient;
public AccessTokenResponse token() {
return authzClient.obtainAccessToken();
}
以下是接收到的令牌:
{
"access_token": ${access-token},
"expires_in": 300,
"refresh_expires_in": 1800,
"refresh_token": ${refresh-token},
"token_type": "bearer",
"id_token": null,
"not-before-policy": 0,
"session_state": "6f284b2f-5bb6-4018-8acd-b83923ebb7d7",
"scope": "profile email"
}
注意:我更换了令牌以使其简短。
问题:
如何使用上面提到的刷新令牌并获取新的访问令牌?AuthzClient是否支持此功能?如果支持,我该如何操作?
我需要创建TokenCallable的新实例并获取令牌吗?如果是这样,如何实例化TokenCallable?
TokenCallable是否线程安全?