Serverside使用Bearer令牌以编程方式在Java中对Keycloak用户进行身份验证

Xan*_*vid 6 java rest jwt bearer-token keycloak

我想使用Keycloak和Bearer令牌在我的Java REST端点中对用户进行身份验证.

我想要实现的工作流程如下:

  1. 客户端使用用户名和密码登录Keycloak.
  2. Keycloak返回一个Bearer令牌(JWT,如果我没错,我该怎么检查?).
  3. 客户端使用'Authorization' : 'Bearer <token>'标头执行Http请求.
  4. REST端点(用Java编写)检查收到的令牌是否正确,并验证从Keycloak接收Principal的用户(如果我理解正确的话).
  5. 经过身份验证后,端点将检查用户是否有权访问该REST api并发回响应.

1,2,3和5已经实现并正常工作但我找不到实现方法4.

我已经尝试过不同的方法:

  • 我的Java端点在WildFly 10.x上发布的EAR中运行,所以我security-constraint在我的web.xml配置Keycloak中使用了一个keycloak.json.
    这工作正常,但我需要在同一个Web上下文中保留一些REST端点公开(即使没有'授权'标题也可访问),据我所知,我无法过滤安全约束中的某些请求.

  • 我尝试实现一个BearerTokenRequestAuthenticator绝对没有成功,即使我可以,我不认为我会收到一个校长作为我的身份验证请求.

现在我已经实现了一种过滤请求的方法,那些需要身份验证的方法被ServiceSecurityInterceptor我实现的类拦截.

在该类的某个时刻,我检查'Authorization'标题是否包含a BasicBearer:

User loggedUser = null;
if (authorizationType.equals("Basic")) {

    // ... decode Base64 username and password ...

    loggedUser = userManagerBean.login(username, password);

} else if (authorizationType.equals("Bearer")) {

   String token = ...; // Get token from header

   // ... Here is where I need to send the token to Keycloak and receive a Principal with the username ...

   loggedUser = userManagerBean.login(username):

}
Run Code Online (Sandbox Code Playgroud)

我在一些地方读到我可能需要一个来自我的Keycloak领域的公钥但是一旦我拥有它,我该怎么办?

use*_*745 0

几个月前,我们推出了 Keycloak。诀窍是让 Keycloak 为您完成这项工作。我猜你正在使用 OpenId 连接?看看这些Java 适配器。也许这个可以为你处理 url 模式匹配。

就我个人而言,我更喜欢使用带有 keycloak 的 Spring boot 安全性。Keycloak Spring Boot Adapter与 Java 应用程序集成良好。您只需在 Java 应用程序和 Keycloak 服务器上进行一些配置。身份验证过程由 KeyCloak 和 Keycloak 适配器自动处理。使用 Spring boot,您还可以为 WildFly 服务器创建一个ear包。KeyCloakPrincipial 是在 Spring 安全上下文中自动创建的 ( SecurityContextHolder.getContext().getAuthentication().getPrincipal() )