我如何使用Keycloak解码JWT

arj*_*wal 3 spring-boot spring-cloud keycloak

我在我的应用程序中使用带有Spring-Boot的Keycloak。我的浏览器客户端请求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();
Run Code Online (Sandbox Code Playgroud)

我想知道是否仍然可以在不使用外部库的情况下做到这一点。我想使用keycloak库显式解码JWT。我怎样才能做到这一点?

Boo*_*mer 8

您必须将keycloak的核心库包含到您的依赖项中。
摇篮: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
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • RSATokenVerifier已过时,应使用TokenVerifier,代码为:AccessToken令牌= TokenVerifier.create(tokenString,AccessToken.class).getToken();。 (5认同)