我在我的应用程序中使用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。我怎样才能做到这一点?
答案 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();
}
}
这为我解决了。