Как пользоваться
Вставьте токен в поле — целиком, вместе с заголовком Authorization: Bearer … или без него, можно с переносами строк. Декодер сразу покажет:
- заголовок — алгоритм подписи (
alg), тип (typ), иногда идентификатор ключа (kid); - payload — все данные токена в отформатированном JSON;
- сроки
iat,nbfиexp— датой и временем в часовом поясе вашего устройства и относительно текущего момента: «через 3 дня», «2 часа назад»; - состояние — истёк токен или ещё действует;
- подпись — как есть, строкой Base64URL.
Токен декодируется в браузере и не загружается на сервер. Храните настоящие токены доступа в секрете: утёкший действующий bearer-токен может дать доступ в пределах своих прав до истечения срока или отзыва. Декодирование не подтверждает действительность токена.
Проверка подписи
Токены с алгоритмом HS256, HS384 и HS512 подписаны общим секретом. Если он у вас есть, введите его в поле под токеном: подпись проверится прямо в браузере. Подписи RS и ES (открытым ключом) калькулятор не проверяет — для них нужен открытый ключ сервера. Payload обычного JWT не зашифрован, а только закодирован в Base64URL: прочитать его может кто угодно, а подделать без ключа — нет. Поэтому:
- не храните в токене пароли и персональные данные;
- не принимайте решений по данным токена, пока сервер не проверил подпись;
- токен с
"alg": "none"и пустой третьей частью ничем не защищён.
Из чего состоит JWT
Токен — три части через точку: заголовок.payload.подпись. Первые две — JSON, закодированный в Base64URL (это Base64, где + и / заменены на - и _, а знаки = в конце отброшены). Пример из стандарта RFC 7519:
eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
Его заголовок — {"typ":"JWT","alg":"HS256"}, payload — {"iss":"joe","exp":1300819380,"http://example.com/is_root":true}. Поле exp равно 1300819380 — это 22 марта 2011 года, 18:43 UTC, так что токен давно истёк.
Стандартные поля
| Поле | Значение |
|---|---|
iss |
кто выпустил токен |
sub |
кому выдан — обычно ID пользователя |
aud |
для какого сервиса предназначен |
exp |
когда истекает (с этого момента токен недействителен) |
nbf |
с какого момента действует |
iat |
когда выпущен |
jti |
уникальный ID токена — чтобы его можно было отозвать |
Время в exp, nbf и iat — Unix timestamp в секундах. Перевести любое такое число в дату можно конвертером Unix timestamp.
Частые ошибки
- «Должно быть три части» — токен скопирован не полностью или с лишним текстом. Частая причина — обрезанный конец при копировании из лога.
- Пять частей — это JWE, зашифрованный токен. Его содержимое без ключа не прочитать, и это нормально.
- «Не Base64URL» — в токен попали кавычки, многоточие или другие посторонние символы.
Частые вопросы
Почему токен «истёк», хотя сервер его принимает? Серверы часто допускают расхождение часов на несколько минут (leeway). Проверьте и время на вашем устройстве: статус считается по нему.
Можно ли изменить payload и отправить токен обратно? Изменить можно, но подпись перестанет совпадать, и сервер, который её проверяет, такой токен отклонит.
Чем раскодировать произвольную строку Base64? Для этого есть Base64-декодер, а большой JSON удобнее разбирать в JSON форматтере.