Ответ
Валидация JWT-токена — это многоэтапный процесс, включающий проверку его структуры, подписи и срока действия.
-
Проверка структуры: Токен должен состоять из трех частей, разделенных точками:
header.payload.signature. -
Проверка подписи (Signature Verification): Это самый важный шаг. С помощью секретного ключа (который известен только серверу) и алгоритма, указанного в
header(например,HS256), вычисляется подпись на основеheaderиpayload. Если вычисленная подпись не совпадает с той, что в токене, токен считается недействительным (возможно, подделан). -
Проверка стандартных полей (Claims Verification): Проверяются поля из
payload:exp(Expiration Time): Срок действия токена не истек.nbf(Not Before): Время, раньше которого токен недействителен.iss(Issuer): Кто выпустил токен.aud(Audience): Для кого предназначен токен.
Пример валидации на Python с PyJWT:
import jwt
import time
# Предположим, это токен от клиента
encoded_token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJleHAiOjE3MzUyMjkxMDB9.Yk9Tstdn8U2Gg7V2fM9S0sYt0Oqj5ofj68s3jYk4DkM"
SECRET_KEY = "your-secret-key"
try:
# decode() автоматически проверяет подпись и срок действия (exp)
decoded_payload = jwt.decode(
encoded_token,
SECRET_KEY,
algorithms=["HS256"],
# Дополнительно можно проверить 'audience' и 'issuer'
# audience="my-app",
# issuer="my-auth-server"
)
print("Токен валиден:", decoded_payload)
except jwt.ExpiredSignatureError:
print("Ошибка: срок действия токена истек.")
except jwt.InvalidSignatureError:
print("Ошибка: неверная подпись токена.")
except jwt.InvalidTokenError as e:
print(f"Ошибка: невалидный токен. {e}")
Важно: Никогда не используйте публичные онлайн-декодеры (вроде jwt.io) для проверки токенов, содержащих реальные или чувствительные данные.