我正在 Quarkus 中试验 OIDC 多租户。 官方文档中的示例使用请求路径来推断租户 ID,然后据此选择 OIDC 配置。
我想要实现的是从当前用户令牌中的声明中获取租户 ID。 我创建了一个自定义的
TenantConfigResolver
。为了获得索赔值,我在解析器中注入了SecurityIdentity
。这很好用。
但是当我想使用
((OidcJwtCallerPrincipal) securityIdentity.getPrincipal()).getClaim("...")
从中读取声明时,我得到了这个异常:
java.lang.IllegalStateException: The current thread cannot be blocked: vert.x-eventloop-thread-3
。
如果我在
TenantResolver
(而不是TenantConfigResolver
)中尝试,也会发生同样的事情。
我想做的事情有意义吗?如果是,正确的做法是什么?
发生这种情况是因为安全身份尚未经过验证和准备。在这种情况下,您需要从原始令牌中获取声明,使用 Vert.x
RoutingContext
(context.request().headers()
) 从 Authorization 标头中获取令牌,将其分割为 .
,Base64 URL 解码中间部分包含 JSON 格式声明的序列,例如,您可以尝试 io.quarkus.oidc.runtime.OidcUtils.decodeJwtContent(rawToken)
,它将返回 Vert.x JsonObject
- 现在一切都已准备好检查声明并动态选择准备好的租户。 HTH