如何设置公钥以验证来自KeyClope的JWT令牌?

如何设置公钥以验证来自KeyClope的JWT令牌?,jwt,rsa,keycloak,Jwt,Rsa,Keycloak,我正在编写后端微服务,它接收来自前端的请求,这些请求具有授权:Bearer…头,令牌来自keydove(位于docker容器内) 我从realm settings的Keys部分获得了RSA公钥来验证该令牌的签名,但似乎当带有KeyClope的容器重新启动时,它会重新生成一对密钥,并且我在service config中设置的公钥无效 使用KeyClope中的RSA公钥的正确方法是什么?有没有办法将其配置为使用域的固定密钥对?域导出时是否导出密钥?或者我必须使用类似url的url从keydape获取

我正在编写后端微服务,它接收来自前端的请求,这些请求具有
授权:Bearer…
头,令牌来自keydove(位于docker容器内)

我从realm settings的Keys部分获得了RSA公钥来验证该令牌的签名,但似乎当带有KeyClope的容器重新启动时,它会重新生成一对密钥,并且我在service config中设置的公钥无效


使用KeyClope中的RSA公钥的正确方法是什么?有没有办法将其配置为使用域的固定密钥对?域导出时是否导出密钥?或者我必须使用类似
url的url从keydape获取公钥http://keycloak:8080/auth/realms/:realm_name:
,我不想这样做,因为这增加了KeyClope和后端之间的依赖关系

您应该基于发卡机构身份服务器的
/.well-known/jwks
端点验证JWT令牌的签名

1) 查询发卡机构标识服务器的
/.well-known/jwks
端点(jwks代表JSON Web密钥集)

2) 从JWKS获取JWK(JSON Web密钥),该JWK具有与我们正在验证的
承载令牌相同的
kid
(密钥ID)。要从JWT令牌中获取
kid
,请首先使用的调试器工具对其进行解码

3) 只要identity server发行的令牌使用非对称加密算法(例如:RS256)进行验证,我们就可以仅使用公钥验证签名(因此您不需要私钥)

4) 可以从JWK中检索公钥(它是JWK JSON中的
x5c
项)

5) 使用此公钥验证JWT
承载人
令牌的签名

例如,在Java中,您可以这样验证它:

//基于访问标识的JWKS RSA公钥(RS256)验证JWT签名
试一试{
Jwk Jwk=新的UrlJwkProvider(新的URL(issuer+Constants.JWKS_ENDPOINT)).get(decodedJWT.getKeyId());
final PublicKey PublicKey=jwk.getPublicKey();
如果(!(公钥实例为RSAPublicKey)){
抛出新的IllegalArgumentException(“在JWKS中找到ID为“+decodedJWT.getKeyId()+”的密钥,但不是RSA密钥”);
}
算法算法=算法.RSA256((rsaplickey)公钥,空);
JWTVerifier verifier=JWT.require(算法)
.与发行人(发行人)
.build();//可重用验证器实例
验证人。验证(Bealertoken);
LOGGER.info(“令牌已验证!”);
}捕获(例外e){
LOGGER.error(例如getMessage());
抛出新的InvalidAccessTokenException(“JWTVerificationException-无效令牌签名”);
}

realm的公钥在重新启动后保持不变,当您重新初始化KeyClope时它会更改。抱歉,忘了添加它在docker容器中,所以当从映像重新创建容器时,它可能也会重新初始化。密钥与初始化不同,您可以编写初始化脚本(需要执行步骤)Dockerfile的电话问题是
http://localhost:8080/auth/realms/my-realm/.well-known/jwks
http://localhost:8080/auth/realms/my-realm/.well-known/jwks.json
都是KeyClope服务器上的404。(它应该有
.json
扩展名,对吗?)但是,
新的UrlJwkProvider(新的URL(“http://localhost:8080/auth/realms/my-realm/protocol/openid connect/certs”)
可以正常工作。谷歌也没有一个
.well-known/jwks
——所以我不知道这有多“知名”…他们都有
.well-known/openid配置。它将返回一个包含
jwks\uurl
字段的对象。对于KeyClope,jwks url将是
/auth/realms/master/protocol/openid connect/certs“