首页 文章

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

提问于
浏览
5

我想使用Keycloak和Bearer令牌在我的Java REST endpoints 中验证用户 .

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

  • 客户端使用用户名和密码登录Keycloak .

  • Keycloak返回一个Bearer令牌(JWT,如果我没错,我该怎么检查?) .

  • 客户端使用 'Authorization' : 'Bearer <token>' 标头执行Http请求 .

  • REST endpoints (用Java编写)检查收到的令牌是否正确,并验证从Keycloak接收Principal的用户(如果我理解正确的话) .

  • 经过身份验证后, endpoints 将检查用户是否有权访问该REST api并发回响应 .

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

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

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

  • 我尝试实现 BearerTokenRequestAuthenticator 但绝对没有成功,即使我不能认为我会因为我的身份验证请求而收到Principal .

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

在该类中的某个时刻,我检查'Authorization'标头是否包含 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):

}

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

1 回答

  • 0

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

    对于我自己,我更喜欢使用带有keycloak的Spring启动安全性 . Keycloak Spring Boot Adapter与Java应用程序很好地集成 . 您只需在Java应用程序和Keycloak服务器上进行一些配置 . 身份验证过程由KeyCloak和Keycloak Adapter自动处理 . 使用Spring启动,您也可以为WildFly Server创建一个ear包 . KeyCloakPrincipial在Springs安全上下文中自动创建(SecurityContextHolder.getContext() . getAuthentication() . getPrincipal())

相关问题