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

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

Not enough segments

Также выводится как

  • jwt.exceptions.DecodeError: Not enough segments

PyJWT (Python) — jwt.exceptions.DecodeError

Что это означает

PyJWT не смог разделить входные данные на `header.payload.signature`: в них меньше двух точек. Строка — не компактный JWS, поэтому ни ключ, ни алгоритм даже не использовались. В `jwt.decode()` приходит не JWT, а что-то другое, либо JWT, который по пути потерял хвост.

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

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

  1. 1.

    Проверьте структуру перед декодированием

    В компактном JWS ровно две точки. Всё остальное отклоняйте с кодом 401 на границе вашего API, чтобы некорректные входные данные никогда не доходили до декодера.

    python
    def bearer_token(headers: dict) -> str | None:
        scheme, _, token = headers.get("Authorization", "").partition(" ")
        if scheme.lower() != "bearer" or token.count(".") != 2:
            return None  # not a compact JWS: answer 401 instead of decoding
        return token
  2. 2.

    Проверяйте непрозрачные токены у издателя

    Если провайдер выпускает непрозрачные токены доступа, обращайтесь к его эндпоинту интроспекции токенов (RFC 7662) или настройте провайдер так, чтобы он выпускал для вашего API токены доступа в формате JWT (часто для этого нужно запросить аудиторию).

    python
    import requests
    
    # Opaque tokens are validated by the authorization server (RFC 7662), not by decoding them.
    resp = requests.post(
        "https://issuer.example.com/oauth2/introspect",
        data={"token": token},
        auth=(CLIENT_ID, CLIENT_SECRET),
        timeout=5,
    )
    active = resp.json().get("active", False)

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

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