Токен состоит из трех частей разделенных точкой. Каждая часть кодируется немного модифицированным base64.
Первые две раскодируются вообще без ключа. В конце подпись, кодированная ключом. В вашем примере это
your-256-bit-secret
(попробуйте там справа, где синенькое напечатать другой ключ и смотрите как меняется токен).
<?php
$key = 'your-256-bit-secret'; // ваш ключ
$jwtToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c';
$jwtArr = array_combine(['header', 'payload', 'signature'], explode('.', $jwtToken));
var_export($jwtArr); /* -> разделяем по точкам
array (
'header' => 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9',
'payload' => 'eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ',
'signature' => 'SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c',
) */
echo PHP_EOL . base64_decode($jwtArr['header']) . PHP_EOL; // декодированный заголовок
// -> {"alg":"HS256","typ":"JWT"}
echo base64_decode($jwtArr['payload']) . PHP_EOL; // декодированная нагрузка
// -> {"sub":"1234567890","name":"John Doe","iat":1516239022}
$calculatedHash = hash_hmac( // сами считаем хеш
'sha256',
$jwtArr['header'] . '.' . $jwtArr['payload'],
$key,
true);
echo base64_encode($calculatedHash) . PHP_EOL;
// -> SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV/adQssw5c=
echo $jwtArr['signature'] . PHP_EOL;
// -> SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
// Похоже? Там слегка модифицированный base64
Третья часть - подпись. Если взять первые две части и получить sha265-хеш с использованием вашего ключа, то он должен совпасть с первой частью. Это подтвердит, что первые две части никто не изменял.
Хоть бы
вики почитал, в самом деле :)