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

时间:2018-04-23 10:37:12

标签: java rest jwt keycloak bearer-token

我想使用Keycloak和Bearer令牌在我的Java REST端点中验证用户。

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

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

    我已尝试过不同的方式:

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

    • 我尝试实施BearerTokenRequestAuthenticator但绝对没有成功,即使我不能认为我会因身份验证请求而收到校长。

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

    在那个班级的某个时刻,我会检查“授权”是否在&#39;标头包含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 :(得分:0)

几个月前,我们推出了Keycloak。诀窍是让Keycloak为您完成工作。我猜您正在使用OpenId connect?看看这些Java-Adapters。也许this one可以为您处理匹配的网址格式。

就我个人而言,我更喜欢将Spring Boot安全性与keycloak结合使用。 Keycloak Spring Boot Adapter与Java应用程序很好地集成。您只需要在Java应用程序和Keycloak服务器上进行一些配置即可。身份验证过程由KeyCloak和Keycloak适配器自动处理。使用Spring引导程序,您还可以为WildFly Server创建一个耳包。在Springs安全上下文( SecurityContextHolder.getContext()。getAuthentication()。getPrincipal()

中自动创建KeyCloakPrincipial