我正在尝试验证(并从JWT令牌读取角色)。遗憾的是,由于我的整体应用程序架构,我无法使用任何适配器或自动配置。
像任何其他JWT令牌一样解码令牌是没有问题的,但是我想知道是否有来自Keycloak的库来存档这个目标。(例如,只需将令牌解析为类似于KeycloakJWTToken的东西,并通过从密钥隐藏服务器获取秘密来验证它)
有什么容易使用的客户吗?
发布于 2021-05-12 15:08:41
我正在使用Jose4J库:https://bitbucket.org/b_c/jose4j/wiki/Home
读取JWT令牌中的声明很简单:
import org.jose4j.jwt.JwtClaims;
import org.jose4j.jwt.consumer.JwtConsumer;
import org.jose4j.jwt.consumer.JwtConsumerBuilder;
public void parseJWT(String token) throws Exception {
JwtConsumer consumer = new JwtConsumerBuilder()
.setSkipAllValidators()
.setDisableRequireSignature()
.setSkipSignatureVerification()
.build();
JwtClaims claims = consumer.processToClaims(token);
System.out.println("* Parsed token: "+ claims.getRawJson() );
System.out.println("* Expiration date: " + new Date(claims.getExpirationTime().getValueInMillis()) );
}
更多的例子可以在GitHub:https://github.com/pvliesdonk/jose4j/blob/master/src/test/java/org/jose4j/examples/ExamplesTest.java上找到。
最后一点:您不需要密钥,也不需要解析 JWT的秘密,但如果需要,您可以使用服务器(公共)密钥来验证--令牌是由您信任的密钥披风服务器签名的。
JWT网站列出了所有用于令牌签名/验证的库:
发布于 2021-05-12 17:05:17
Keycloak访问令牌实际上是JWT令牌。因此,您可以充分利用现有的JWT库,包括Keycloak正式文档中所述的验证:
--如果您需要手动验证Keycloak发出的访问令牌,您可以调用内省端点。这种方法的缺点是您必须对Keycloak服务器进行网络调用。如果同时有太多的验证请求,这可能会很慢,并且可能会使服务器超载。Keycloak颁发的访问令牌是JSON令牌(JWT),它使用JSON签名(JWS)进行数字签名和编码。因为它们是以这种方式编码的,因此允许您使用发出域的公钥在本地验证访问令牌。您可以在验证代码中硬编码领域的公钥,也可以使用包含JWS中嵌入的密钥ID ( can )的证书端点查找和缓存公钥。根据您使用哪种语言编写代码,有许多第三方库可以帮助您进行JWS验证。
此外,在Java中,使用Keycloak适配器,角色通常映射在用户主体上,即允许isUserInRole()
。这是目标之一。此外,还可以将Principal
从SecurityContext
中转换为KeycloakPrincipal
,然后再从KeycloakPrincipal
中获得KeycloakSecurityContext
。使用KeycloakSecurityContext
,您可以访问ID和访问令牌(如果适用的话),并且可以读取它们的属性、属性和声明。
请注意,使用Keycloak UI来“评估”标记也是很好的实践,而且非常有用。例如,您可以在Client Scopes
选项卡(在Evaluate
下)中看到生成的令牌,以及在客户端的授权选项卡(在“评估”下)中评估您的策略和权限。请参阅在设置客户端时,https://www.keycloak.org/docs/latest/server_admin/#_client_scopes_evaluate可能是调试和测试的最佳方式。
如果您在评估屏幕中选择了一个用户,将生成以下示例数据:
生成访问令牌(...)
所有示例都是为特定用户生成的,并且是为特定客户端发出的,其作用域参数的指定值。这些示例包括所有使用的声明和角色映射。
来源:
https://stackoverflow.com/questions/67505168
复制相似问题