dzheka3d
@dzheka3d

Для чего нужны параметры в JWT?

Всем привет! Использую (пытаюсь) библиотеку JWT. Просто взял пример из документации и запускаю... Все работает, но я не могу понять, для чего нужны некоторые параметры...
Код прокомментировал на каждой строке, где понимаю что-то и где не понимаю... Пните пожалуйста!

$signer = new Lcobucci\JWT\Signer\Hmac\Sha256();

/*====== Генерируем токен ======*/
$token = (new Lcobucci\JWT\Builder())
      // Не понятно для чего это
      ->setIssuer('http://example.com') // Configures the issuer (iss claim)
      // Не понятно для чего это
                        ->setAudience('http://example.org') // Configures the audience (aud claim)
      // Не понятно для чего это
                        ->setId('4f1g23a12aa', true) // Configures the id (jti claim), replicating as a header item
      // Не понятно для чего это
                        ->setIssuedAt(time()) // Configures the time that the token was issue (iat claim)
      // Время жизни токена
                        ->setExpiration(time() + 3600) 
      // Данные, которые храним в ключе, чтобы потом использовать их после получения токена (ID)
                        ->set('user_id', 1453535345) 
      ->set('login', 'username')
      // ключ токена, если совпадает при проверке, значит это наш токен либо же кто-то украл ключ и лепит их от нашего имени
      ->sign($signer, 'testing')
      // Получает сгенерированный токен (объект в строке)
                        ->getToken();
            
// $token - это и есть токен который нужно передать юзеру при успешной авторизации
// его же мы и будем получать при каждом обращении к сайту
// echo $token;

$token = (new Lcobucci\JWT\Parser())->parse((string) $token); // получили токен, скажем, из $_GET['token']

/*====== проверяем токен =======*/
$data = new Lcobucci\JWT\ValidationData(); // Он будет использовать текущее время для проверки (iat, nbf и exp)
// Эти параметры должны совпадать с теми, которые генерируются вместе с токеном
// Но для чего? Ведь если токен может расшифровать любой, у кого он есть, он также сможет вставлять эти данные в собственные токены
$data->setIssuer('http://example.com');
$data->setAudience('http://example.org');
$data->setId('4f1g23a12aa');

var_dump($token->validate($data)); // проверка токена по времни
var_dump($token->verify($signer, 'testing')); // проверка токена по ключу, если не совпадает - значит не мы создавали токен и данные могут быть липовыми


т.е. проблема, по сути, в большинстве, вот в этих строках:

->setIssuer('http://example.com') // Configures the issuer (iss claim)
->setAudience('http://example.org') // Configures the audience (aud claim)
->setId('4f1g23a12aa', true) // Configures the id (jti claim), replicating as a header item
->setIssuedAt(time())


Просто, на сколько я понимаю, в них нет смысла...
Ведь проще было бы с помощью ключа зашифровать все данные в токене, чтобы никто не смог расшифровать буквально ничего. Тогда проверки на то, кто издал этот токен, также не потребовались...
  • Вопрос задан
  • 509 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Ведисофт Екатеринбург
от 25 000 ₽
YCLIENTS Москва
от 200 000 до 350 000 ₽
от 300 000 до 500 000 ₽
06 мая 2024, в 10:17
15000 руб./за проект
06 мая 2024, в 10:02
3000 руб./за проект