我正在通过Keycloak Java适配器API在Java 8中针对Keycloak使用用户身份验证。
在这种情况下,类KeycloakBuilder(keycloak-admin-client-6.0.0.jar)将构建一个Keycloak实例来执行身份验证操作。
如何使用此API请求脱机令牌而不是普通的Bearer令牌?
找不到参数或请求它的方式。我需要令牌有效期为1个月的令牌,除非更改“ SSO会话最大值”字段,否则将无法获得令牌,但是我不希望这会影响其他客户机或同一领域/客户机中的用户。
答案 0 :(得分:2)
我不确定Keycloak Java适配器是否有任何特色,但是我已经与其他客户端一起实现了。在授权服务器端,您需要向用户添加角色offline_access
,这些用户可以请求脱机会话(可以显式完成,也可以作为默认角色映射)。在客户端,您必须将另一个作用域offline_access
添加到auth请求中。默认情况下也可以这样做(请参阅默认范围)。有关更多详细信息,请参阅有关Offline Sessions的官方Keycloak文档。
答案 1 :(得分:1)
我改用keycloak-authz-client库发布一种可能的解决方案。
如@Philipp所述,还需要您登录的用户具有offline_access角色。
public String login(String username, String password) {
String authServerUrl = "http://localhost:18080/auth"; // Your keycloak auth entpoint
String realm = "realm"; // Realm
String clientId = "client"; // Client
Map<String, Object> clientCredentials = new LinkedHashMap<String, Object>();
clientCredentials.put("secret", "clientSecret"); // Client secret (Access Type: Confidential)
Configuration configuration = new Configuration(
authServerUrl,
realm,
clientId,
clientCredentials,
null
);
AuthzClient authzClient = AuthzClient.create(configuration);
AuthorizationRequest request = new AuthorizationRequest();
request.setScope("offline_access");
AuthorizationResponse response = authzClient.authorization(username, password).authorize(request);
return response.getRefreshToken(); // response.getToken() returns the bearer token
}