Java 用于验证 FusionAuth HS256 签名 ID 令牌的代码
Java code for verification of FusionAuth HS256 signed id token
如何使用 FusionAuth java 客户端库验证 HS256 ID 令牌?
描述:我在 FusionAuth 中创建了一个应用程序,它生成了客户端 ID 和客户端密码,我没有接触任何其他 section/tab,比如 JWT 等,默认的 JWT 签名算法是 OIDC 标准 HMAC SHA256。
我尝试使用以下代码方法基于 public 密钥验证令牌,但它不适用于 HS256 签名令牌,我在互联网上搜索并发现 public 密钥不适用于 HS256
能否请您提供一个 Java 代码以使用 FusionAuth Java 客户端库 (https://github.com/FusionAuth/fusionauth-jwt) 验证 HS256 签名令牌。
另请告知我是否需要在 FusionAuth 管理控制台上进行任何其他配置。
我试过的代码:它给出了空白 public 键。
List<JSONWebKey> keys = JSONWebKeySetHelper.retrieveKeysFromJWKS("http://localhost:9011/.well-known/jwks.json");
Map<String, Verifier> publicKeyVerifiers = new HashMap<String, Verifier>();
JWT jwtDecoded = JWT.getDecoder().decode(idToken, publicKeyVerifiers);
README里好像有例子:
// Build an HMC verifier using the same secret that was used to sign the JWT
Verifier verifier = HMACVerifier.newVerifier("too many secrets");
// Verify and decode the encoded string JWT to a rich object
JWT jwt = JWT.getDecoder().decode(encodedJWT, verifier);
// Assert the subject of the JWT is as expected
assertEquals(jwt.subject, "f1e33ab3-027f-47c5-bb07-8dd8ab37a2d3");
https://github.com/FusionAuth/fusionauth-jwt#verify-and-decode-a-jwt-using-hmac
使用 HMAC 签名,您需要将秘密(上例中的"too many secrets"
)分发到需要验证 JWT 的所有位置。
应用程序收到的令牌通常应使用非对称密钥进行签名。然后,您可以使用通过 JWKS 端点提供的签名 public 密钥来验证令牌的数字签名。令牌最主流的算法是RS256。也许您需要按照建议重新配置 here?。我认为您的代码也可以正常工作。
HS256 是一种对称算法,感觉不对,因为客户端只有在拥有完整签名密钥的情况下才能验证 JWT。这使恶意客户端能够铸造自己的令牌,而只有授权服务器才能做到这一点。出于这个原因,如果 JWT 使用对称密钥签名,JWKS 端点将不会提供令牌签名密钥。
意思是 Curity 有一个很好的相关文档:
如何使用 FusionAuth java 客户端库验证 HS256 ID 令牌?
描述:我在 FusionAuth 中创建了一个应用程序,它生成了客户端 ID 和客户端密码,我没有接触任何其他 section/tab,比如 JWT 等,默认的 JWT 签名算法是 OIDC 标准 HMAC SHA256。
我尝试使用以下代码方法基于 public 密钥验证令牌,但它不适用于 HS256 签名令牌,我在互联网上搜索并发现 public 密钥不适用于 HS256
能否请您提供一个 Java 代码以使用 FusionAuth Java 客户端库 (https://github.com/FusionAuth/fusionauth-jwt) 验证 HS256 签名令牌。 另请告知我是否需要在 FusionAuth 管理控制台上进行任何其他配置。
我试过的代码:它给出了空白 public 键。
List<JSONWebKey> keys = JSONWebKeySetHelper.retrieveKeysFromJWKS("http://localhost:9011/.well-known/jwks.json");
Map<String, Verifier> publicKeyVerifiers = new HashMap<String, Verifier>();
JWT jwtDecoded = JWT.getDecoder().decode(idToken, publicKeyVerifiers);
README里好像有例子:
// Build an HMC verifier using the same secret that was used to sign the JWT
Verifier verifier = HMACVerifier.newVerifier("too many secrets");
// Verify and decode the encoded string JWT to a rich object
JWT jwt = JWT.getDecoder().decode(encodedJWT, verifier);
// Assert the subject of the JWT is as expected
assertEquals(jwt.subject, "f1e33ab3-027f-47c5-bb07-8dd8ab37a2d3");
https://github.com/FusionAuth/fusionauth-jwt#verify-and-decode-a-jwt-using-hmac
使用 HMAC 签名,您需要将秘密(上例中的"too many secrets"
)分发到需要验证 JWT 的所有位置。
应用程序收到的令牌通常应使用非对称密钥进行签名。然后,您可以使用通过 JWKS 端点提供的签名 public 密钥来验证令牌的数字签名。令牌最主流的算法是RS256。也许您需要按照建议重新配置 here?。我认为您的代码也可以正常工作。
HS256 是一种对称算法,感觉不对,因为客户端只有在拥有完整签名密钥的情况下才能验证 JWT。这使恶意客户端能够铸造自己的令牌,而只有授权服务器才能做到这一点。出于这个原因,如果 JWT 使用对称密钥签名,JWKS 端点将不会提供令牌签名密钥。
意思是 Curity 有一个很好的相关文档: