如何从 Keycloak 获取用户 ID 和用户 UUID/GUID?
Posted
技术标签:
【中文标题】如何从 Keycloak 获取用户 ID 和用户 UUID/GUID?【英文标题】:How to get user id, and user UUID/GUID from Keycloak? 【发布时间】:2021-10-11 05:10:21 【问题描述】:我在 docer 中使用 Keycloak 并托管在 https://accounts.example.com
。
我使用 React 作为我的客户端库,登录后,用户进入 https://user.example.com
。
此 React 客户端使用位于 https://api.user.example.com
的 .NET Core API。
我使用keycloak.js
来管理 React 面板中的访问。
现在假设用户想要创建一张票。我将此票信息发送到 API:
title: 'Urgent backup',
priority: 'urgent',
description: 'Please backup my files immediately'
在我们的数据库中,我们有这样的设计:
create table Tickets
(
Id bigint not null primary identity(1, 1),
UserGuid uniqueidentifier not null, -- How should I fill this column?
Title nvarchar(200) not null,
PriorityId int not null,
Description nvarchar(max) not null
)
问题是,API 应该从用户那里提取永久数据。
我当然不能在该列中存储email
或username
。我什至不能依赖 username
或 email
因为 Keycloak 的管理面板允许配置此设置:
因此,最好的选择是在 Keycloak 中给用户一个 GUID
或 UUID
,并在 open id 令牌中检索它。
我搜索过,但找不到如何执行此操作。
你能帮忙吗?
【问题讨论】:
【参考方案1】:默认情况下,您的访问令牌应该有一个主题 (sub
) 声明,其值为 Keycloak 中的用户 ID。那是一个UUID。
您可以从令牌中提取该 ID 并使用它。
也许 ASP.NET 核心会自动执行此操作,并为您提供主题声明作为用户名。
【讨论】:
【参考方案2】:我不确定问题到底出在哪里,Keycloak 已经提供了获取/更新/删除用户的 API
Get users 返回用户列表,根据查询参数过滤:
GET /realm/users
在查询参数中,您可以根据电子邮件/名字/姓氏/用户名进行过滤
如果你想获取所有用户,它会给出类似的结果
[
"id":"569f67de-36e6-4552-ac54-e52085109818",
"username":"user1",
"enabled":true,
...
,
"id":"90afb701-fae5-40b4-8895-e387ba34902jh",
"username":"user2",
"enabled":true,
....
]
如果你想获取单个用户,你也可以使用下面的 API 来获取它
GET /realm/users/id
如果您看到第一个其余查询,您可以根据您的要求使用查询参数进行查询并获取结果,然后id
可以用于您的第二个表。
编辑 -
默认情况下,可以直接从principal获取User ID
String userId = accessToken.getSubject();
在 .Net Core 中我发现了这个
public static T GetLoggedInUserId<T>(this ClaimsPrincipal principal)
if (principal == null)
throw new ArgumentNullException(nameof(principal));
var loggedInUserId = principal.FindFirstValue(ClaimTypes.NameIdentifier);
if (typeof(T) == typeof(string))
return (T)Convert.ChangeType(loggedInUserId, typeof(T));
else if (typeof(T) == typeof(int) || typeof(T) == typeof(long))
return loggedInUserId != null ? (T)Convert.ChangeType(loggedInUserId, typeof(T)) : (T)Convert.ChangeType(0, typeof(T));
else
throw new Exception("Invalid type provided");
【讨论】:
我知道我可以使用管理 API 来获取用户列表。但我不知道如何从 OIDC 令牌中提取用户 UUID。以上是关于如何从 Keycloak 获取用户 ID 和用户 UUID/GUID?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Java API 从 keycloak 获取用户的名字、姓氏和属性?
如何通过 id 获取其他用户信息(用户名、名字)? [钥匙斗篷]
如何从 KeyCloak 获取用户组并用 Java 打印它们