Сообщение об ошибке
jwt audience invalid. expected: <audience>
Вместо заполнителя подставляется значение из ваших настроек, например «jwt audience invalid. expected: api://orders».
Что это означает
Криптографическую проверку токен прошёл, но его утверждение aud не совпадает с аудиторией, которую требует проверяющая сторона. Проверка аудитории нужна, чтобы токен, выпущенный для одного API, нельзя было повторно предъявить другому: подпись доказывает, кто выпустил токен, а aud — для какого сервиса он выпущен, и обе проверки должны пройти, прежде чем утверждениям можно доверять.
Почему это происходит
Идентификатор не совпадает посимвольно
частоaud сравнивается посимвольно, как строка. Строки https://api.example.com и https://api.example.com/ (косая черта в конце), http и https, идентификатор клиента и идентификатор API — любое такое расхождение приводит к ошибке. Провайдеры OAuth часто записывают в aud client_id, если вы не запрашиваете конкретную аудиторию.
Токен выпущен для другого API
частоКлиент получил токен для сервиса A и отправил его в сервис B. Так часто бывает, когда один поставщик удостоверений обслуживает несколько API: параметр аудитории (audience) в запросе токена должен называть тот API, которому будет предъявлен токен.
aud — массив, и ожидания расходятся
иногдаПо спецификации aud может быть массивом строк. jsonwebtoken засчитывает совпадение, если любой элемент равен любому из ожидаемых значений — но код, который заранее вручную проверяет aud в расчёте на обычную строку, ломается на утверждениях-массивах.
Как исправить
- 1.
Сравните то, что есть в токене, с тем, что вы ожидаете
Выведите оба значения. Исправьте то, которое неверно: настройку аудитории у проверяющей стороны или параметр audience/resource, который клиент передаёт при запросе токена.
js const { aud } = jwt.decode(token); console.log("token aud:", aud); // e.g. "api://orders" or ["api://orders"] jwt.verify(token, key, { algorithms: ["ES256"], audience: "api://orders", // must match exactly (string, array or RegExp) }); - 2.
Явно разрешите допустимые варианты
Если для этого API действительно допустимы несколько идентификаторов, перечислите их, а не отключайте проверку аудитории, чтобы избавиться от ошибки.
js jwt.verify(token, key, { algorithms: ["ES256"], audience: ["api://orders", "https://api.example.com"], });