如何使用 Keycloak Rest 端点获取 Keycloak 中用户的上次登录会话详细信息?

Kar*_*Ece 11 keycloak keycloak-services

如何使用 keycloak Rest 端点获取 Keycloak 中用户的上次登录会话详细信息?

例子:

builder.append(OAuth2Constants.AUDIENCE+"="+clientId+"&");
builder.append(OAuth2Constants.GRANT_TYPE+"="+OAuth2Constants.UMA_GRANT_TYPE+"&");
headers.put("Content-Type", "application/x-www-form-urlencoded");
headers.put("Authorization", "Bearer "+accessToken);

//String keycloakURL = keyCloakCFGBean.getCreateRefreshSession();
String keycloakURL="http://10.10.8.113:10004/auth/realms/{realm}/protocol/openid-connect/token";
keycloakURL = keycloakURL.replace("{realm}", realmName);

URL url = new URL(keycloakURL);
httpURLConnection  = (HttpURLConnection) url.openConnection();
httpURLConnection.setUseCaches(false);
httpURLConnection.setDoInput(true);
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setDoOutput(true);
if (headers != null && headers.size() > 0) {
    Iterator<Entry<String, String>> itr = headers.entrySet().iterator();
    while (itr.hasNext()) {
        Entry<String, String> entry = itr.next();
        httpURLConnection.setRequestProperty(entry.getKey(), entry.getValue());
    }
}

outputStreamWriter = new OutputStreamWriter(httpURLConnection.getOutputStream(), StandardCharsets.UTF_8);
outputStreamWriter.write(builder.toString());
outputStreamWriter.flush();
Run Code Online (Sandbox Code Playgroud)

cod*_*ips 20

所以这里有几种情况。所有这些信息都假设您拥有在身份验证/授权请求标头中发送的适当的不记名令牌,并且要求您在 Keycloak 领域拥有足够的管理员权限。

我没有详细介绍您用特定语言编写的精确代码,但希望这些说明能够清楚地说明您需要代码执行哪些操作。

会议

如果您对 ACTIVE 用户会话特别感兴趣,则可以使用 API 端点,如下所述:https: //www.keycloak.org/docs-api/11.0/rest-api/index.html#_getsessions

即:
GET /{realm}/users/{id}/sessions
例如完整的 URL 为:
https://{server}/auth/admin/realms/{realm}/users/{id}/sessions

在响应中,将有一个名为 的属性lastAccess,其中包含一个数字,该数字是自 1970 年 1 月 1 日以来的常用 UNIX 毫秒数。如果您获取该数字,则可以使用您选择的语言(从外观上看是 Java?)对其进行解析,以获取所需格式的日期/时间。

所有登录

不过,我怀疑您真正想要的是查看 Keycloak 中所有存储信息的最后一次登录,而不仅仅是活动用户会话,因此您需要查找领域事件。请注意,Keycloak 仅存储一定时间的事件,因此如果它早于该时间,那么您将找不到任何条目。您可以在领域管理控制台的事件配置页面中更改事件的存储时间。

要获取所有领域事件,请调用此处提到的端点: https: //www.keycloak.org/docs-api/11.0/rest-api/index.html#_getevents(搜索“获取事件返回所有事件,或过滤它们基于此处列出的 URL 查询参数”(如果链接没有直接将您带到那里)。

GET /{realm}/events 完整的 URL 为: https://{server}/auth/admin/realms/{realm}/events

您需要根据“类型”过滤结果(即,只有“登录”类型的事件),如果您想检查特定用户,您还需要根据userIdID过滤结果该用户帐户。

您可以将这两个过滤器作为请求的一部分执行,这样您就不必获取事件的完整列表并在客户端对其进行过滤。要过滤请求,您可以执行以下操作:

https://{server}/auth/admin/realms/{realm}/events?type=LOGIN&user={id}

time然后,您可以从生成的 JSON 中获取代表该登录事件的属性最高值的结果。该time属性将再次是自 1970 年 1 月 1 日以来的 UNIX 时间(以毫秒为单位),因此一旦获得它,您就可以将其转换为适合您的格式。

希望这有帮助!


Fat*_*teh -3

使用Keycloak Rest Api

${keycloakUri}/admin/realms/${keycloakRealm}/users
Run Code Online (Sandbox Code Playgroud)

您将收到 JWT 响应。对其进行解码,您将获得与用户相关的所有信息。

或者您可以使用 java 客户端 API,例如

Keycloak kc = KeycloakBuilder.builder() 
        .serverUrl("https://localhost:8443/auth")
        .realm("master")
        .username("admin") 
        .password("admin") 
        .clientId("Mycli") 
        .resteasyClient(new ResteasyClientBuilder().connectionPoolSize(10).build()) 
        .build();

CredentialRepresentation credential = new CredentialRepresentation();
credential.setType(CredentialRepresentation.PASSWORD);
credential.setValue("test123");

UserRepresentation user = new UserRepresentation();
user.setUsername("testuser2");
user.setFirstName("Test2");
user.setLastName("User2");
user.setEmail("aaa@bbb.com");
user.setCredentials(Arrays.asList(credential));
user.setEnabled(true);
user.setRealmRoles(Arrays.asList("admin"));

UsersResource usersResource  = kc.realm("my-realem").users();
UserResource userResource = usersResource.get("08afb701-fae5-40b4-8895-e387ba1902fb");
Run Code Online (Sandbox Code Playgroud)

您将获得用户列表。按用户 ID 过滤,您将找到所有用户信息。

  • 用户信息中没有上次登录信息 (3认同)