Отладка AWS HTTP API (бета) JWT Authorizer - PullRequest
2 голосов
/ 15 января 2020

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

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

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

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

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

{"message":"Unauthorized"}

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

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

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

Ответы [ 2 ]

2 голосов
/ 26 марта 2020

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

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

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

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

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

1 голос
/ 07 апреля 2020

Посмотрите на ответ. Существует заголовок www-authenticate, который содержит ответ об ошибке, если аутентификация не удалась.

т.е.:

www-authenticate: объем носителя = "" error = "invalid_token" error_description = " Ошибка связи JWKS "

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...