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