Как angular-jwt декодирует мой JWT без секрета?

Команда Auth0 создала что-то под названием «angular-jwt», в котором есть класс jwtHelper. Эта штука успешно декодирует локальный 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);

    });

Вот ссылка на полный пример: https://github.com/auth0/angularjs-jwt-authentication-tutorial


person G. Deward    schedule 11.08.2015    source источник


Ответы (1)


JWT использует кодирование, а не шифрование. Данные, которые содержит токен, не являются секретом, их может расшифровать и просмотреть любой желающий. Что делает сервер, так это подписывает токен, используя секрет (в вашем случае config.secret), что фактически делает невозможным изменение токена без знания секрета. Следовательно, только сервер сможет изменить содержимое токена, а прочитать его сможет любой.

person Yuri Zarubin    schedule 11.08.2015
comment
Аааа... они подписаны! О чем я только думал!?!? Спасибо, Юрий. - person G. Deward; 12.08.2015
comment
Для справки: этот ответ применим только при использовании симметричных ключей (например, HMAC-SHA256). Также можно использовать асимметричные ключи (например, RSA-SHA256), которые позволяют подписывать токены с помощью закрытого ключа и проверять их с помощью открытого ключа. Также можно иметь зашифрованные утверждения в токене, если их нужно скрыть от клиента, или иметь полностью зашифрованные токены с использованием JWE: tools.ietf.org/html/draft-ietf-jose-json-web-encryption-40 - person Rodrigo López Dato; 14.08.2015
comment
Это сделало мой день... Спасибо - person SoliQuiD; 01.11.2016