Аут 0, конфигурация аудитории - PullRequest
0 голосов
/ 25 марта 2019

Я только что узнал, что у меня проблема с auth0, и это относится к аудитории конфигурации auth0. Поэтому, когда я явно пишу аудиторию, проверка JWT завершилась неудачно с ошибкой The provided Algorithm doesn't match the one defined in the JWT's Header. Когда я не пишу аудиторию, все будет работать нормально, за исключением того, что каждый раз, когда токен истекает и пользователь нажимает на ссылку входа, он пропускает процесс входа в систему и немедленно вошел в систему с предыдущими учетными данными. Я не хочу, чтобы это произошло, я хочу, чтобы пользователь по-прежнему аутентифицировал себя снова после истечения срока действия токена, точно так же, как когда я пишу аудитории.

Так что же такое аудитория и почему это влияет на поведение?

И как я могу это исправить, чтобы получить поведение, которое я хотел?

Ниже приведена конфигурация Auth0

auth0 = new auth0.WebAuth({
        clientID: environment.auth0ClientId,
        domain: environment.auth0Domain,
        responseType: 'token id_token',
        //Below is the audience I'm talking about
        audience: '${constants.MY_APP}/userinfo',
        redirectUri: `${constants.ORIGIN_URL}/auth`,
        scope: 'openid email'
    });

Мне нужно знать, как правильно настроить JWT, а также правильно выполнить поведение при входе в систему по истечении срока действия JWT.

1 Ответ

0 голосов
/ 27 марта 2019

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

...