gpt4 book ai didi

java - Auth0 java-jwt 库无法验证有效 token

转载 作者:行者123 更新时间:2023-11-30 10:36:08 26 4
gpt4 key购买 nike

我正在使用 Auth0 java-jwt 库生成 JWT token ,但是,一旦生成我就无法验证 token 。

这是我用来生成 token 的代码:

final JWTSigner signer = new JWTSigner(secret);
final HashMap<String, Object> claims = new HashMap<String, Object>();
claims.put("user", user);
claims.put("email", user.getEmail());
final String jwt = signer.sign(claims);
return jwt;

这是我的 secret 和 token (它在 https://jwt.io/ 中正确验证):

secret:
sfnd984f94j3fjn

token: eyJ0eXBlIjoiSldUIiwiYWxnIjoiSFMyNTYifQ.eyJ1c2VyIjp7ImlkIjoyLCJlbWFpbCI6InNhbnRob3NoQHh5ei5jb20iLCJwYXNzd29yZCI6IiQyYSQxMCRHSlNNRGtRRUEvRVNsRENJcVlud0R1Ly45YWRqRWRQalVvSWVKUmlsSmpSeHh6N2s2Q01xQyIsImZpcnN0X25hbWUiOiJzYW50aG9zaCIsImxhc3RfbmFtZSI6Imt1bWFyIiwic3RhdHVzIjoxLCJ0aXRsZSI6IkFzc29jIiwicm9sZXMiOlt7ImlkIjoxLCJyb2xlIjoiVVNFUiJ9XX0sImVtYWlsIjoic2FudGhvc2hAeHl6LmNvbSJ9.0SHNCgUWOijpYv7xcNoPiCwg_OFZQnsdi5l7YhCsSjU

当我使用相同的 JWT token 通过 Auth0 方法验证它时失败(总是以签名异常结束):

try {           
final JWTVerifier verifier = new JWTVerifier(secret);
final Map<String, Object> claims= verifier.verify(jwt);
final String email = (String)claims.get("email");
user = userService.loadUserByEmail(email);
} catch (UsernameNotFoundException e) {
// Invalid Token
} catch (SignatureException e) {
System.out.println(e.toString());
} catch (IOException e) {
} catch (Exception e) {
}

我调试了库,我认为这就是问题所在(在 JWTVerifier 类中):

void verifySignature(String[] pieces, String algorithm) 
throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {

Mac hmac = Mac.getInstance(algorithm);
hmac.init(new SecretKeySpec(decoder.decodeBase64(secret), algorithm));
byte[] sig = hmac.doFinal(
new StringBuilder(pieces[0]).append(".").append(pieces[1]).toString().getBytes());

if (!Arrays.equals(sig, decoder.decodeBase64(pieces[2]))) {
throw new SignatureException("signature verification failed");
}
}

这在我看来是错误的,因为 pieces[1]pieces[0] 是用 hmac.doFinal 解码的,其中pieces[2] 只是简单的 base64 解码。

我的假设是否正确。这是库中的错误还是我弄错了什么?

最佳答案

正在使用的 JWTVerifier 版本假设您传递的 secret 是 Base64url 编码的,因此它会在使用它作为验证签名的 key 之前自动对其进行解码。 p>

鉴于 sfnd984f94j3fjn 是真正的 secret ,并且您的 JWTVerifier 版本会自动对您传递的任何内容进行 Base64url 解码,您需要对 sfnd984f94j3fjn 进行编码> 在 Base64url 中并将编码版本传递给 JWTVerifier

类似的东西:

import org.apache.commons.codec.binary.Base64;

// ...

Base64 encoder = new Base64(true);

encoder.encodeBase64("sfnd984f94j3fjn".getBytes());

您可以在您正在使用的 JWTVerifier 类版本的以下行中看到 secret 的自动解码:

hmac.init(new SecretKeySpec(decoder.decodeBase64(secret), algorithm));

关于此的更新,最新版本的库似乎不采用 Base64url 编码。

关于java - Auth0 java-jwt 库无法验证有效 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40731578/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com