Auth0 может выдавать два типа токенов: непрозрачный и JWT.
Если вы укажете параметр audience
, вы получите токен JWT. JWT отличаются от непрозрачных токенов тем, что они автономны, и поэтому вы проверяете их непосредственно в своем приложении.
В этом случае полученный вами JWT подписывается с помощью алгоритма, отличного от того, который вы определили в логике проверки. Вы можете декодировать JWT, используя https://jwt.io, и вы можете увидеть, с каким алгоритмом он подписан, в атрибуте alg
заголовка.
Вы также можете узнать алгоритм подписи, используемый вашим API, на панели инструментов Auth0. Зайдите в API, выберите ваш API, перейдите на вкладку «Настройки» и перейдите к настройке токена. Вы увидите его в списке как Алгоритм подписи.
Судя по сообщению об ошибке, вы используете библиотеку java-jwt
, и в этом случае вам необходимо будет изменить алгоритм подписи в соответствии с указанными здесь шагами: https://github.com/auth0/java-jwt#verify-a-token
Для HS256:
try {
Algorithm algorithm = Algorithm.HMAC256("secret");
JWTVerifier verifier = JWT.require(algorithm)
.withIssuer("auth0")
.build(); //Reusable verifier instance
DecodedJWT jwt = verifier.verify(token);
} catch (JWTVerificationException exception){
//Invalid signature/claims
}
Где secret
- секрет подписи вашего API.
Для RS256 это немного сложнее. Сначала необходимо декодировать токен, чтобы извлечь kid
(идентификатор ключа) из заголовка:
String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.AbIJTDMFc7yUa5MhvcP03nJPyCPzZtQcGEp-zWfOkEE";
try {
DecodedJWT jwt = JWT.decode(token);
} catch (JWTDecodeException exception){
//Invalid token
}
Затем вам нужно сконструировать JwkProvider с использованием библиотеки jwks-rsa-java :
JwkProvider provider = new UrlJwkProvider("https://your-domain.auth0.com/");
Jwk jwk = provider.get(token.getKeyId());
Наконец, вы можете использовать открытый ключ, полученный из JWKS, и использовать его для проверки токена:
RSAPublicKey publicKey = (RSAPublicKey) jwk.getPublicKey();
try {
Algorithm algorithm = Algorithm.RSA256(publicKey, null);
JWTVerifier verifier = JWT.require(algorithm)
.withIssuer("auth0")
.build(); //Reusable verifier instance
DecodedJWT jwt = verifier.verify(token);
} catch (JWTVerificationException exception) {
//Invalid signature/claims
}
Имейте в виду, что предпочтительно использовать RS256 вместо HS256 по причинам, указанным здесь: https://auth0.com/docs/apis#signing-algorithms
Вы также можете найти эту статью полезной для получения подробной информации о проверке токенов: https://auth0.com/docs/api-auth/tutorials/verify-access-token