Необходимо проверить подпись токена JWT на основе конечной точки сервера идентификации эмитента /.well-known/jwks
.
1) Запросить конечную точку сервера идентификации эмитента /.well-known/jwks
(JWKS означает набор веб-ключей JSON)
2) Из JWKS получить JWK (веб-ключ JSON) с тем же kid
(идентификатор ключа) в качестве токена Bearer
, который мы проверяем.Чтобы получить kid
из вашего токена JWT, сначала расшифруйте его, используя инструмент отладчика jwt.io .
3) Пока токены, выданные сервером идентификации, проверяются асимметричнокриптографическим алгоритмом (например, RS256), мы можем проверить подпись только с помощью открытого ключа (поэтому вам не понадобится закрытый ключ)
4) открытый ключ можно получить из JWK (этоx5c
запись в JWK JSON)
5) Проверьте подпись токена JWT Bearer
с помощью этого открытого ключа.
Например, в 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.");
}