11

Auth0 チームは、jwtHelper クラスを持つ「angular-jwt」と呼ばれるものを作成しました。このことは、サーバーで使用したシークレットなしでローカル JWT を正常にデコードします。どうしてそうなった?それらが安全でない場合、シークレットを使用して署名/暗号化するポイントは何ですか?

トークンを暗号化するサーバー上の機能 (「jsonwebtoken」を使用):

function createToken (user) {
    return jwt.sign(_.omit(user, 'password'), config.secret, { expiresInMinutes: 60*5 });
}

クライアントからのコード:

angular
    .module('sample.home', [
        'ui.router',
        'angular-storage',
        'angular-jwt'
    ])
    .config(function ($stateProvider) {
        $stateProvider
            .state('home', {
                url: '/',
                controller: 'HomeCtrl',
                templateUrl: 'modules/home/home.html',
                data: { requiresLogin: true }
            })
    })
    .controller('HomeCtrl', function homeController ($scope, $http, store, jwtHelper) {

        $scope.jwt = store.get('jwt');
        $scope.decodedJwt = $scope.jwt && jwtHelper.decodeToken($scope.jwt);

    });

完全な例へのリンクは次のとおりです: http://github.com/auth0/ang...

4

1 に答える 1

12

JWT は、暗号化ではなくエンコードを使用します。トークンに含まれるデータは秘密ではなく、誰でもデコードして表示できます。サーバーが行うことは、シークレット (この場合はconfig.secret) を使用してトークンに署名することです。これにより、シークレットを知らずにトークンを変更することは事実上不可能になります。したがって、トークンの内容を変更できるのはサーバーだけですが、誰でもトークンを読み取ることができます。

于 2015-08-11T22:58:59.370 に答える