keycloak - 如何使用 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();
解决方案
所以这里有几个场景。所有这些信息都假定您有一个适当的不记名令牌,您将在请求的标头中发送该令牌以进行身份验证/授权,并要求您在 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 时间,因此您可以再次将其转换为适合您的格式。
希望这会有所帮助!
推荐阅读
- java - 如何为广告暴民和加载以及在活动中显示创建单独的类?
- python - 如何修复 Firestore 查询突然不起作用
- android - android 应用程序的 Xamarin nuget 包更新失败
- node.js - 如何在 React App 中使用 Active Directory 实现 SSO 身份验证?
- ios - 无法推断复杂的闭包返回类型 SwiftUI ForEach
- c# - 调用处理程序而不在 URL 上指定 ashx 文件?
- ios - 如何在 iOS 中检测应用程序强制退出事件
- c# - 查询语句问题,WHERE 附近的语法不正确
- python - 你能得到“无”的神经网络层的输出形状吗?
- git - 自定义 Git 凭证助手