Сообщение об ошибке
Audience doesn't match
Также выводится как
- jwt.exceptions.InvalidAudienceError: Audience doesn't match
PyJWT (Python) — jwt.exceptions.InvalidAudienceError
Что это означает
В токене есть утверждение `aud`, и вы передали `audience=` в `jwt.decode()`, но ни одно значение не совпало. PyJWT принимает токен, если хотя бы одна из аудиторий токена равна одной из разрешённых вами аудиторий; здесь совпадений нет. Подпись при этом верна — токен выпущен для другого получателя.
Почему это происходит
Токен выпущен для другого API
частоКогда один поставщик удостоверений обслуживает несколько сервисов, клиент легко может отправить в сервис B токен, выпущенный для сервиса A. Проверка аудитории нужна именно для того, чтобы отклонять такие токены.
Один и тот же идентификатор записан по-разному
частоСтроки сравниваются точно: косая черта в конце, `http` и `https`, идентификатор клиента и URL-идентификатор API или заглавные буквы — во всех этих случаях аудитории считаются разными.
В API пришёл ID-токен
иногдаВ ID-токенах OpenID Connect в `aud` записан идентификатор клиентского приложения. В API следует передавать токены доступа, выпущенные для него; пересылка ID-токена в API завершается этой ошибкой.
Как исправить
- 1.
Сравните aud токена с вашей аудиторией
Декодируйте токен без проверки только для того, чтобы посмотреть содержимое, а затем проверьте его с точным идентификатором. Если токен выпущен не для той аудитории, измените запрос токена на клиенте; если идентификатор записан с ошибкой, исправьте его в коде проверки.
python unverified = jwt.decode(token, options={"verify_signature": False}) print(repr(unverified.get("aud"))) # str or list[str] claims = jwt.decode( token, signing_key, algorithms=["ES256"], audience="https://api.example.com/orders", # must equal one of the token's aud values issuer="https://issuer.example.com/", ) - 2.
Явно разрешите несколько идентификаторов
`audience` принимает список. Используйте его, если у одного API действительно несколько идентификаторов; никогда не передавайте `options={"verify_aud": False}`, чтобы избавиться от ошибки.
python # Any one of these may appear in the token's aud. claims = jwt.decode(token, signing_key, algorithms=["ES256"], audience=["orders-api", "https://api.example.com/orders"])