如何使用Keycloak

时间:2018-01-05 05:58:53

标签: spring-boot spring-cloud keycloak

我在我的应用程序中使用Keycloak和Spring-Boot。我的浏览器客户端请求keycloak生成JWT,然后将此JWT发送到我的ZUUL服务器,该服务器使用keycloak-spring适配器验证JWT,然后我编写了一个预过滤器来解码JWT有效负载并提取用户名。 我正在使用com.auth0.java-jwt库解码JWT,如下面的代码片段

 DecodedJWT dJWT=JWT.decode(header);
 String username=dJWT.getClaim("preferred_username").asString();

我想知道无论如何我都可以在不使用外部库的情况下完成此操作。我想使用keycloak库显式解码JWT。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:6)

您必须将keycloak的核心库包含在您的依赖项中 Gradle:compileOnly 'org.keycloak:keycloak-core:3.4.2.Final'

然后使用org.keycloak.RSATokenVerifier来解析令牌 例如:

try
{
  AccessToken token = RSATokenVerifier.create(tokenString).getToken();
  System.out.printf("iss = %s%n", token.getIssuer());
  System.out.printf("sub = %s%n", token.getSubject());
  System.out.printf("typ = %s%n", token.getType());
}
catch (VerificationException e)
{
  // some error handling
}

您还可以通过设置公钥激活RSATokenVerifier上的各种验证,特别是签名验证:

RSATokenVerifier.create(tokenString).checkActive(true).publicKey(key).verify().getToken()

答案 1 :(得分:1)

当我使用keycloak来验证jwt时,它会解码jwt并将详细信息放入SecurityContextHolder中,我只是从中自动提取详细信息。这是代码。

    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    if (authentication != null) {
        if (authentication.getPrincipal() instanceof KeycloakPrincipal) {
            KeycloakPrincipal<KeycloakSecurityContext> kp = (KeycloakPrincipal<KeycloakSecurityContext>) authentication.getPrincipal();
            // retrieving username here
            String username = kp.getKeycloakSecurityContext().getToken().getPreferredUsername();
            }
      }

这为我解决了。