Сообщение об ошибке
Invalid audience
Также выводится как
- jwt.exceptions.InvalidAudienceError: Invalid audience
Сравните с ошибкой «Audience doesn't match»: она означает, что вы передали `audience`, но ни одно значение не совпало.
PyJWT (Python) — jwt.exceptions.InvalidAudienceError
Что это означает
В токене есть утверждение `aud`, но `jwt.decode()` вызван без аргумента `audience`. PyJWT не игнорирует аудиторию, которую не может проверить: токен, в котором назван получатель, отклоняется, если вы не укажете, какой именно вы получатель. То же сообщение появляется, если у `aud` недопустимый тип (не строка и не список строк).
Почему это происходит
Код проверки не передаёт аудиторию
частоКод, написанный для токенов без `aud` (или скопированный из минимального примера), перестаёт работать, как только поставщик удостоверений начинает добавлять `aud`, — а большинство поставщиков делают это для токенов доступа и ID-токенов. Предусмотренное решение — передать ожидаемую аудиторию.
ID-токен вместо токена доступа
иногдаНекоторые поставщики удостоверений выпускают токены доступа без `aud`, но в `aud` ID-токена всегда записывают идентификатор клиента (частый пример — Amazon Cognito). Код, который работает с токенами доступа, начинает выдавать ошибку, как только клиент отправляет свой ID-токен.
У утверждения aud недопустимый тип
редкоЕсли издатель записывает `aud` как число, объект или список, в котором есть не только строки, PyJWT не может сопоставить такой токен ни с чем.
Как исправить
- 1.
Передайте PyJWT свою аудиторию
Передайте идентификатор своего API (или список допустимых идентификаторов). Не отключайте `verify_aud` — именно эта проверка не даёт принять токены, выпущенные для других сервисов.
python claims = jwt.decode( token, signing_key, algorithms=["ES256"], audience="https://api.example.com", # the identifier your API is registered with ) - 2.
Используйте декодирование без проверки только для просмотра
`verify_signature: False` отключает все проверки, включая проверку аудитории. Это полезно, чтобы прочитать `aud` при отладке, но никогда не годится для авторизации запроса.
python # Reading claims without trusting them (debugging, routing) - never for authorization. header = jwt.get_unverified_header(token) claims = jwt.decode(token, options={"verify_signature": False})