Сообщение об ошибке
Invalid crypto padding
Также выводится как
- Invalid header padding
- Invalid payload padding
- jwt.exceptions.DecodeError: Invalid crypto padding
Слово перед «padding» называет сегмент: `header`, `payload` или `crypto` (подпись).
PyJWT (Python) — jwt.exceptions.DecodeError while base64url-decoding a segment
Что это означает
PyJWT разделил токен на три сегмента, но не смог декодировать один из них из base64url. «crypto padding» относится к третьему сегменту (подписи), «header padding» и «payload padding» — к первому и второму. Сегменты JWS должны использовать URL-безопасный алфавит base64 (`A–Z a–z 0–9 - _`) без дополнения `=`; пробелы, `+`, `/` или неверная длина приводят к ошибке декодирования ещё до проверки подписи.
Почему это происходит
К токену всё ещё присоединён префикс Bearer
частоЕсли передать `"Bearer eyJ…"`, в сегмент заголовка попадают пробел и слово Bearer, и его декодирование завершается ошибкой «Invalid header padding».
Код, создающий токен, использовал стандартный base64
частоСамописный код подписи, который использует `base64.b64encode` вместо URL-безопасного варианта или сохраняет дополнение `=`, создаёт сегменты с символами `+`, `/` или `=`. Чаще всего это затрагивает сегмент подписи, и появляется ошибка «Invalid crypto padding».
По пути токен прошёл URL-кодирование или URL-декодирование
иногдаТокены, переданные в строке запроса или в полях формы, могут прийти с последовательностями `%2B`/`%3D` или с символами `+`, превращёнными декодером формы в пробелы.
При копировании добавились или потерялись символы
иногдаПереводы строк из терминала, кавычки из JSON или многоточие, вставленное программой просмотра журналов, меняют длину сегментов и их алфавит.
Как исправить
- 1.
Отрежьте схему аутентификации и проверьте алфавит
Принимайте только `Bearer <token>`, где токен соответствует шаблону JWS в base64url; на всё остальное отвечайте 401 ещё до вызова PyJWT.
python import re BASE64URL_JWS = re.compile(r"^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]*$") def extract(authorization: str) -> str: scheme, _, token = authorization.partition(" ") token = token.strip() if scheme.lower() != "bearer" or not BASE64URL_JWS.match(token): raise ValueError("not a compact JWS") return token - 2.
Кодируйте в base64url без дополнения
Если вы собираете токены сами, используйте URL-безопасный base64 и удаляйте `=` в конце. А лучше доверьте сборку токена библиотеке JOSE.
python import base64 def b64url(data: bytes) -> str: # JWS uses base64url WITHOUT padding (RFC 7515 section 2). return base64.urlsafe_b64encode(data).rstrip(b"=").decode("ascii")