Отладка AWS HTTP API (бета) JWT Authorizer

Я экспериментирую с бета- функцией "HTTP API" AWS Api Gateway.

В рамках этого эксперимента я пытаюсь авторизовать доступ к API с помощью "JWT Authorizer":

https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-jwt-authorizer.html

В документации указано, что JWT пройдет рабочий процесс, состоящий из серии проверок / верификации JWT, прежде чем он будет авторизован или отклонен.

Без авторизатора конечная точка доступна. С авторизатором я получаю ответ 401 с json:

{"message":"Unauthorized"}

Я пытаюсь понять, на каком этапе авторизатор отклоняет JWT. Я установил журнал для конечной точки api и вижу, что поступает запрос, но он не дает представления о том, почему происходит сбой авторизации.

Есть ли способ отладить, почему / где не работает авторизатор?

Примечание: это не касается авторизаторов lamda, и я не использую Cognito для генерации JWT.

2 ответа

Решение

401 означает, что аутентификация пользователя не может быть установлена. По сути, JWT либо неисправен, либо ему не предоставляется запрос в заголовке, который ожидает шлюз API.

Кроме того, API-шлюз не является полноценным сервером, поэтому мы не сможем отладить, как шлюз API использует JWT. Хотя это может показаться неприятным, обратите внимание, что он предоставляет вам хорошо масштабируемую, надежную и дешевую конечную точку HTTP для вашего бэкэнда со встроенной поддержкой аутентификации на основе JWT, и она только что стала доступной в большинстве регионов. Так что я бы пока не вычеркивал.

Возвращаясь к вашему вопросу. Хотя я не знаю, как помочь с отладкой. Я могу рассказать вам, какие шаги я предпринял, чтобы поэкспериментировать с авторизатором JWT, не написав ни единой строчки кода.

  1. Создан временный JWK через https://mkjwk.org/, который дает вам открытый ключ и набор пар закрытый + открытый ключ с использованием ребенка по вашему выбору и алгоритма RS256
  2. Скопируйте открытый ключ и вставьте его в свой ISSUER_URL/.well-known/jwks.json. Если вы не используете Cognito, вы можете провести эксперимент с помещением файла в S3 (в этом случае URL-адрес вашей корзины S3 становится URL-адресом эмитента). При использовании S3 вам также потребуется создать файл ISSUER_URL/.well_known/openid-configuration и сделать эти файлы общедоступными на время эксперимента. Эти файлы соответствуют стандартному формату (OIDC), который можно искать в Интернете. Обратите внимание, что файл jwks.json содержит только открытый ключ, поэтому не имеет значения, даже если кто-то другой получит его в свои руки.
  3. Возьмите набор пар закрытый + открытый ключ и перейдите на https://8gwifi.org/jwkconvertfunctions.jsp, чтобы получить отдельные закрытые и общедоступные ключи pem RSA.
  4. Перейдите на https://jwt.io/ и выберите алгоритм RS256, запрос заголовка ребенка (с использованием того же значения, что и для генерации ключей на первом этапе), утверждение aud в полезной нагрузке (это должно соответствовать конфигурации, выбранной вами при настройке JWT авторизатор в шлюзе HTTP API), утверждение iss в полезной нагрузке (оно должно соответствовать ISSUER_URL), заявка exp в полезной нагрузке (время истечения JWT, вы можете использовать https://www.epochconverter.com/), утверждение nbf в полезная нагрузка (просто возьмите текущую отметку времени с https://www.epochconverter.com/), а также открытый и закрытый ключи RSA pem, которые вы получили на предыдущем шаге, должны быть помещены в соответствующий раздел подписи. Также предоставьте утверждение о полезной нагрузке scp, если вы установили область авторизации при настройке авторизатора JWT с шлюзом HTTP API.

После всего этого я смог проверить, что шлюз API может работать с созданным мной JWT. Теперь я могу с большей уверенностью приступить к написанию кода, и, к счастью, есть инструменты на JAVA, node и т. Д., Которые уже доступны.

Взгляните на ответ. Заголовок www-Authenticate содержит ответ об ошибке, если аутентификация не удалась.

то есть:

www-Authenticate: Bearer scope="" error="invalid_token" error_description="Ошибка связи JWKS"

Если вы используете curl, вы можете попробовать его с -v, чтобы увидеть полный ответ, включая заголовок.

Для тех, кто сталкивается

издатель в метаданных конечной точки обнаружения OIDC не соответствует настроенному издателю "

ошибка при размещении их конфигурации OpenId и файла JWK на S3.

Убедитесь, что вы используете

https://BUCKETNAME.s3.amazonaws.com/

вместо

https://BUCKETNAME.REGION.s3.amazonaws.com/

для поля эмитента.

Другие вопросы по тегам