Перейти к содержимому
ecdsa.com
PyJWT (Python)Библиотеки JWT

Сообщение об ошибке

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 - _`) без дополнения `=`; пробелы, `+`, `/` или неверная длина приводят к ошибке декодирования ещё до проверки подписи.

Почему это происходит

Как исправить

  1. 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. 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")

Связанные ошибки

Открыть всю базу ошибок подписей