1

認証用のRSA署名トークン機能を備えたJWTとともにジャージーレストWebサービスを使用しています。トークンを正常に作成してフロントエンドに送信できました。ここまで達成した後、トークンの検証と、リソースを要求しているユーザーの識別について混乱しています。

ここでいくつか質問があります:

  1. クレームを確認するために、フロントエンドで受信した jwt トークンをデコードする必要がありますか?
  2. バックエンドでリソースを要求しているユーザーを特定するにはどうすればよいですか?

SO の投稿のいくつかでは、フロント エンドでトークンをデコードする必要はないと言う人もいるため (このリンクを確認してください)、他のサイトの他の例では、このようなフロント エンドでトークンをデコードする例が示されています。

今、フロントエンドでトークンを実際にデコードするか、そのままにしておくべきかについて、さらに先に進む方法を混乱させていますか? もしそうなら、他の例では、次のようにフロントエンドでデコードを示しています

angular.module('app')
   .factory('Auth', ['$http', '$localStorage', 'urls', function ($http, $localStorage, urls) {
       function urlBase64Decode(str) {
           var output = str.replace('-', '+').replace('_', '/');
           switch (output.length % 4) {
               case 0:
                   break;
               case 2:
                   output += '==';
                   break;
               case 3:
                   output += '=';
                   break;
               default:
                   throw 'Illegal base64url string!';
           }
           return window.atob(output);
       }

       function getClaimsFromToken() {
           var token = $localStorage.token;
           var user = {};
           if (typeof token !== 'undefined') {
               var encoded = token.split('.')[1];
               user = JSON.parse(urlBase64Decode(encoded));
           }
           return user;
       }

ここで使用しているトークンの例:

private void authenticate(String email, String password)
    throws Exception {
try {
    Connection con = DBConnection.getConnection();
    PreparedStatement statement = con.prepareStatement("select USR_PRIMARY_EMAIL, USR_PASSWORD from TBL_USER where USR_PRIMARY_EMAIL=? and USR_PASSWORD=?");
    statement.setString(1, email);
    statement.setString(2, password);
    ResultSet result = statement.executeQuery();
    if (result.next()) {
        System.out.println("User authenticated successfully");

        KeyPairGenerator keyGenerator = KeyPairGenerator.getInstance("RSA");
        keyGenerator.initialize(1024);

        KeyPair kp = keyGenerator.genKeyPair();
        RSAPublicKey publicKey = (RSAPublicKey) kp.getPublic();
        RSAPrivateKey privateKey = (RSAPrivateKey) kp.getPrivate();
        JWSSigner signer = new RSASSASigner(privateKey);

        JWTClaimsSet claimsSet = new JWTClaimsSet();
        claimsSet.setSubject("alice");
        claimsSet.setIssuer("https://c2id.com");
        claimsSet.setExpirationTime(new Date(new Date().getTime() + 60 * 1000));

        System.out.println("publicKey is: " + publicKey);
        System.out.println("privateKey is: " + privateKey);
        System.out.println("claimsSet is: " + claimsSet);

        SignedJWT signedJWT = new SignedJWT(new JWSHeader(JWSAlgorithm.RS256),claimsSet);

        signedJWT.sign(signer);
        token = signedJWT.serialize();
        System.out.println("Token is: " + token);

        signedJWT = SignedJWT.parse(token);

        System.out.println("signedJWT is: " + signedJWT);

        JWSVerifier verifier = new RSASSAVerifier(publicKey);
        assertTrue(signedJWT.verify(verifier));
        assertEquals("alice", signedJWT.getJWTClaimsSet().getSubject());
        assertEquals("https://c2id.com", signedJWT.getJWTClaimsSet().getIssuer());
        assertTrue(new Date().before(signedJWT.getJWTClaimsSet().getExpirationTime()));
    } else {
        System.out.println("User doesn't exist");
    }
} catch (Exception e) {
    System.out.println("DB related Error");
    e.printStackTrace();
}
}

また、もう 1 つの問題は、nimbus+jose_JWT(RSA 署名) を使用して生成されたトークンです。Angular auth0ライブラリでデコードできません。公開鍵を使用しているからですか?

4

1 に答える 1

3

クレームを確認するために、フロントエンドで受信した jwt トークンをデコードする必要がありますか?

はい。JWT クレーム セットは base64URL でエンコードされた JSON であるため、読み取るにはデコードする必要があります。


バックエンドでリソースを要求しているユーザーを特定するにはどうすればよいですか?

subクレームはオプションですが、実際にはすべての JWT プロバイダーが、リクエスターを識別するサブジェクト ID を持つすべてのトークンを発行します。JWT仕様から:

「サブ」(サブジェクト) クレームは、JWT のサブジェクトであるプリンシパルを識別します。JWT のクレームは通常、サブジェクトに関するステートメントです。サブジェクト値は、発行者のコンテキストでローカルに一意になるように範囲を限定するか、グローバルに一意にする必要があります。このクレームの処理は、一般にアプリケーション固有です。「サブ」値は、StringOrURI 値を含む大文字と小文字を区別する文字列です。このクレームの使用はオプションです。


また、もう 1 つの問題は、nimbus+jose_JWT(RSA 署名) を使用して生成されたトークンです。Angular auth0 ライブラリでデコードできません。公開鍵を使用しているからですか?

いいえ。すべての JWT クレーム セットは、署名方法とは関係なく、base64URL でエンコードされた JSON であるため、デコードできるはずです。

于 2016-01-02T01:51:41.750 に答える