首页 > 解决方案 > 如何使用 Keycloak 休息端点在 Keycloak 中获取用户的最后登录会话详细信息?

问题描述

如何使用 keycloak 休息端点在 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();

标签: keycloakkeycloak-services

解决方案


所以这里有几个场景。所有这些信息都假定您有一个适当的不记名令牌,您将在请求的标头中发送该令牌以进行身份​​验证/授权,并要求您在 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 中所有存储信息的最后一次登录,而不仅仅是活动用户会话,因此您需要查找 Realm EVENTS。请注意,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

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

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

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

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

希望这会有所帮助!


推荐阅读