gpt4 book ai didi

jwt - 如何设置公钥以从 Keycloak 验证 JWT token ?

转载 作者:行者123 更新时间:2023-12-03 21:21:29 34 4
gpt4 key购买 nike

我正在编写后端微服务,它接收来自前端的请求,其中有 Authorisation: Bearer ... header ,带有从 keycloak(在 docker 容器内)获得的 token 。

我从领域设置的 Keys 部分获得了 RSA 公钥来验证该 token 的签名,但似乎当带有 keycloak 的容器重新启动时,它会重新生成一对 key ,并且我在服务配置中设置的公钥变得无效。

从keycloak使用RSA公钥的正确方法是什么?有没有办法将它配置为使用一对固定的 key 对领域?领域导出时是否导出 key ?或者我必须使用像 http://keycloak:8080/auth/realms/:realm_name: 这样的 URL 从 keycloak 获取公钥,我宁愿不这样做,因为这会增加 keycloak 和后端之间的依赖关系。

最佳答案

您应该根据颁发者身份服务器的 /.well-known/jwks 验证 JWT token 的签名。端点。

1) 查询发卡行身份服务器的/.well-known/jwks端点(JWKS 代表 JSON Web key 集)

2) 从 JWKS,获取具有相同 kid 的 JWK(JSON Web Key) ( key ID)作为 Bearer我们正在验证的 token 。获取 kid从您的 JWT token 中,首先使用 jwt.io 对其进行解码的调试器工具。

3) 只要使用非对称加密算法(例如:RS256)验证身份服务器颁发的 token ,我们就可以仅使用公钥验证签名(因此您不需要私钥)

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

5) 验证 JWT Bearer带有此公钥的 token 签名。

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

// verify JWT signature based on Access Identity's JWKS RSA public key (RS256)
try {

Jwk jwk = new UrlJwkProvider(new URL(issuer + Constants.JWKS_ENDPOINT)).get(decodedJWT.getKeyId());
final PublicKey publicKey = jwk.getPublicKey();

if (!(publicKey instanceof RSAPublicKey)) {
throw new IllegalArgumentException("Key with ID " + decodedJWT.getKeyId() + " was found in JWKS but is not a RSA-key.");
}

Algorithm algorithm = Algorithm.RSA256((RSAPublicKey) publicKey, null);
JWTVerifier verifier = JWT.require(algorithm)
.withIssuer(issuer)
.build(); //Reusable verifier instance

verifier.verify(bearerToken);

LOGGER.info("Token verified!");

} catch (Exception e) {
LOGGER.error(e.getMessage());
throw new InvalidAccessTokenException("JWTVerificationException - Invalid token signature.");
}

关于jwt - 如何设置公钥以从 Keycloak 验证 JWT token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53543117/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com