0

如何使用 FusionAuth java 客户端库验证 HS256 ID 令牌?

描述:我在 FusionAuth 中创建了一个应用程序,它生成了一个客户端 ID 和客户端密码,我没有触及任何其他部分/选项卡,如 JWT 等,默认 JWT 签名算法是 OIDC 标准 HMAC SHA256。

我尝试使用以下代码方法基于公钥验证令牌,但它不适用于 HS256 签名令牌,我在互联网上搜索发现公钥不适用于 HS256

您能否提供一个 Java 代码来使用 FusionAuth Java 客户端库(https://github.com/FusionAuth/fusionauth-jwt)验证 HS256 签名令牌。还请让我知道我是否需要在 FusionAuth 管理控制台上进行任何其他配置。

我试过的代码:它给出了空白的公钥。

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);
4

2 回答 2

2

应用程序收到的令牌通常应使用非对称密钥进行签名。然后,您可以使用通过 JWKS 端点提供的签名公钥来验证令牌的数字签名。令牌最主流的算法是RS256。也许您需要按照此处的建议重新配置?我认为您的代码也将起作用。

HS256 是一种对称算法,感觉不对,因为客户端只有拥有完整的签名密钥才能验证 JWT。这使得恶意客户端能够铸造他们自己的令牌,而只有授权服务器才能做到这一点。因此,如果 JWT 曾经使用对称密钥进行签名,JWKS 端点将不会提供令牌签名密钥。

意思是说 Curity 有一个很好的相关文档:

于 2022-02-10T20:11:33.840 回答
1

看起来自述文件中有一个示例:

// 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 的所有位置。

于 2022-02-10T14:45:19.347 回答