Auth0 java-jwt
ライブラリを使用してJWTトークンを生成していますが、一度生成されるとトークンを検証できません。Auth0 java-jwtライブラリが有効なトークンの検証に失敗する
これは私がトークンを生成するために使用するコードです:
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;
これは(それがhttps://jwt.io/で正しく検証し)私の秘密とトークンです:
秘密:
sfnd984f94j3fjnトークン:eyJ0eXBlIjoi私はそれが失敗したAuth0メソッドを使用して、それを確認するために、同じJWTトークンを使用する場合SldUIiwiYWxnIjoiSFMyNTYifQ.eyJ1c2VyIjp7ImlkIjoyLCJlbWFpbCI6InNhbnRob3NoQHh5ei5jb20iLCJwYXNzd29yZCI6IiQyYSQxMCRHSlNNRGtRRUEvRVNsRENJcVlud0R1Ly45YWRqRWRQalVvSWVKUmlsSmpSeHh6N2s2Q01xQyIsImZpcnN0X25hbWUiOiJzYW50aG9zaCIsImxhc3RfbmFtZSI6Imt1bWFyIiwic3RhdHVzIjoxLCJ0aXRsZSI6IkFzc29jIiwicm9sZXMiOlt7ImlkIjoxLCJyb2xlIjoiVVNFUiJ9XX0sImVtYWlsIjoic2FudGhvc2hAeHl6LmNvbSJ9.0SHNCgUWOijpYv7xcNoPiCwg_OFZQnsdi5l7YhCsSjU
は
(常に署名例外で終了):
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) {
}
は、私は、ライブラリをデバッグし、Iこれは問題がどこにあると思いますか(JWTVerifier
クラス):pieces[1]
とpieces[0]
がpieces[2]
がデコード単なるBASE64をあるようhmac.doFinal
でデコードされているので
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");
}
}
これは私には間違って見えます。
私の前提は正しいですか?これはライブラリのバグですか、何か間違っていますか?
ドキュメントを更新する必要があります。それは明らかではない。ありがとう。 – swordfish
[このコミット](https://github.com/auth0/java-jwt/commit/1e6f68764b26f62d39b04da6eca878c0989c6e5a)によれば、秘密はもはやBase64とみなされないので、使用しているバージョンとオンラインドキュメント –