Jwt 身份验证0配置访问群体

Jwt 身份验证0配置访问群体,jwt,auth0,Jwt,Auth0,我刚刚发现auth0有一个问题,它与auth0配置受众有关。因此,当我显式编写受众时,JWT验证失败,出现错误提供的算法与JWT头中定义的算法不匹配。当我不编写受众时,一切都会正常工作,除了现在每次令牌过期和用户单击登录链接,它都会跳过登录过程并立即使用以前的凭据登录。我不希望这种情况发生,我希望用户在令牌过期后仍能再次验证自己,就像我编写访问群体时一样 那么什么是观众?为什么它会影响这样的行为 我该如何修复它以获得我想要的行为 下面是Auth0的配置 auth0 = new auth0.Web

我刚刚发现auth0有一个问题,它与auth0配置受众有关。因此,当我显式编写受众时,JWT验证失败,出现错误
提供的算法与JWT头中定义的算法不匹配。
当我不编写受众时,一切都会正常工作,除了现在每次令牌过期和用户单击登录链接,它都会跳过登录过程并立即使用以前的凭据登录。我不希望这种情况发生,我希望用户在令牌过期后仍能再次验证自己,就像我编写访问群体时一样

那么什么是观众?为什么它会影响这样的行为

我该如何修复它以获得我想要的行为

下面是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过期时正确地进行登录行为。

Auth0可以发出两种类型的令牌:不透明和JWT

当您指定
访问群体
参数时,您将收到一个JWT令牌。JWT不同于不透明令牌,因为它们是自包含的,因此您可以直接在应用程序中验证它们

在本例中,您收到的JWT使用与您在验证逻辑中定义的算法不同的算法进行签名。您可以使用对JWT进行解码,并且可以在标头的
alg
属性中看到它是用哪个算法签名的

您还可以在Auth0仪表板中找到API使用的签名算法。转到API,单击您的API,单击设置选项卡,然后滚动到令牌设置。您将看到它作为签名算法列出

根据错误消息判断,您使用的是
java jwt
库,在这种情况下,您需要按照此处概述的步骤相应地更改签名算法:

对于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
(密钥ID):

String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.AbIJTDMFc7yUa5MhvcP03nJPyCPzZtQcGEp-zWfOkEE";
try {
    DecodedJWT jwt = JWT.decode(token);
} catch (JWTDecodeException exception){
    //Invalid token
}
然后,您需要使用以下库构造JwkProvider:

最后,您可以使用从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:


您可能还发现本文对于验证令牌的详细信息很有用:

Auth0可以发布两种类型的令牌:不透明和JWT

当您指定
访问群体
参数时,您将收到一个JWT令牌。JWT不同于不透明令牌,因为它们是自包含的,因此您可以直接在应用程序中验证它们

在本例中,您收到的JWT使用与您在验证逻辑中定义的算法不同的算法进行签名。您可以使用对JWT进行解码,并且可以在标头的
alg
属性中看到它是用哪个算法签名的

您还可以在Auth0仪表板中找到API使用的签名算法。转到API,单击您的API,单击设置选项卡,然后滚动到令牌设置。您将看到它作为签名算法列出

根据错误消息判断,您使用的是
java jwt
库,在这种情况下,您需要按照此处概述的步骤相应地更改签名算法:

对于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
(密钥ID):

String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.AbIJTDMFc7yUa5MhvcP03nJPyCPzZtQcGEp-zWfOkEE";
try {
    DecodedJWT jwt = JWT.decode(token);
} catch (JWTDecodeException exception){
    //Invalid token
}
然后,您需要使用以下库构造JwkProvider:

最后,您可以使用从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:


您可能还发现本文对验证令牌的详细信息很有用:

非常好的演练,真的帮了我大忙!很棒的步行体验,真的帮了我的忙!