2016-11-21 4 views
2

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"); 
    } 
} 

これは私には間違って見えます。

私の前提は正しいですか?これはライブラリのバグですか、何か間違っていますか?

答えて

1

JWTVerifierのバージョンは、通過する秘密がBase64urlでエンコードされていると仮定しているため、署名を検証する鍵としてを使用する前に自動的にデコードします。考えるsfnd984f94j3fjn

は自動的Base64urlあなたは、あなたがBase64urlでsfnd984f94j3fjnをエンコードし、JWTVerifierにエンコードされたバージョンを渡す必要がを渡しどんなデコード実際の秘密とJWTVerifierのバージョンです。

これに似た何か:

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

// ... 

Base64 encoder = new Base64(true); 

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

あなたは秘密の自動復号化は、使用しているJWTVerifierクラスのバージョンの次の行に起こって見ることができます:

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

このアップデートでは、ライブラリの最新バージョンがBase64urlを想定していないようですエンコーディング。

+1

ドキュメントを更新する必要があります。それは明らかではない。ありがとう。 – swordfish

+0

[このコミット](https://github.com/auth0/java-jwt/commit/1e6f68764b26f62d39b04da6eca878c0989c6e5a)によれば、秘密はもはやBase64とみなされないので、使用しているバージョンとオンラインドキュメント –

関連する問題