Отсутствует токен аутентификации при доступе к шлюзу API?


85

Я пытаюсь вызвать лямбда-функцию через AWS API Gateway. Когда я упоминаю тип аутентификации NONE, он работает нормально, но API становится общедоступным, и любой, у кого есть URL-адрес, может получить доступ к моему API. Чтобы сделать вызов API безопасным, я использую тип аутентификации AWS_IAM, а также прикрепил политику AmazonAPIGatewayInvokeFullAccess к моему пользователю, но получаю эту ошибку:

{ message: "Missing Authentication Token"}

Я не знаю, что мне здесь не хватает.


Я считаю, что большинство, если не все ответы здесь также будут работать для любой другой службы AWS (например, DynamoDB), сопоставленной с заданной конечной точкой ресурса шлюза API. При условии, что это правда, API Gateway является здесь рабочим интерфейсом (а не ресурсом AWS Service).
cellepo,

Ошибка возникла в результате попадания не в ту конечную точку
Rexben

Ответы:


45

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

Используйте расширение Postman Chrome для тестирования своего API: http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-use-postman-to-call-api.html


Привет, Саддам! ​​Как аутентификация AWS может быть выполнена в интерфейсе SOAP. В POSTMAN это очень просто. Есть ли у нас аналогичный способ в интерфейсе SOAP?
Панкадж Шарма

173

Я потерял время по глупой причине:

При создании этапа отображаемая ссылка не содержит ресурсной части URL-адреса:

URL-адрес API: https://1111.execute-api.us-east-1.amazonaws.com/dev

API + RESOURCE URL https://1111.execute-api.us-east-1.amazonaws.com/dev/get-list

/ Получить-лист пропускал

И, конечно же, нужно убедиться, что конфигурация метода выглядит так:

введите описание изображения здесь


14
Особые похвалы требуются за признание глупых (но частых) причин проблемы. Это меня тоже достало.
Джефф Ричардс,

Извините, я не понял, что вы имели в виду. Если вы хотите проверить, настроен ли почтовый запрос для использования аутентификации, вам нужно нажать на опцию POST под созданным вами ресурсом, например, у вас может быть / my- post-call в ваших ресурсах, и под ним у вас есть методы OPTION и POST. Щелкните POST, а затем в конфигурации метода вы увидите, требуется ли аутентификация. Но если вы хотите получить полный URL-адрес для почтового вызова, он работает так же, как получение URL-адреса API + RESOURCE, например, 1111.execute-api.us-east-1.amazonaws.com/dev/my- pos-tcall
Карлос Альберто Шнайдер

2
Еще одна глупая вещь, которая меня сбила с толку: убедитесь, что ваш HTTP-глагол верен. Я по ошибке отправлял GET вместо POST. Кажется, вы получите эту ошибку на любом маршруте, который не совпадает в точности ни с точки зрения пути, ни с точки зрения глагола.
Josh1billion 08

Большое спасибо !! Когда вы об этом упомянули, это так просто. Я не понимал. Спасибо, мужик!
ylev

FWIW, щелкнув сначала сам ресурс (в данном случае GET) в дереве этапов, я считаю, что должен напрямую показать полный URL-адрес этого ресурса. Более подробная информация и пояснительная картинка в моем ответе: stackoverflow.com/a/60858537/1357094
cellepo

21

У меня была такая же проблема, и, похоже, это сообщение также отображается, если ресурс не может быть найден.

В моем случае я обновил API, но забыл выполнить повторное развертывание. Проблема была решена после развертывания обновленного API на моем этапе.


Вот как я заставил это работать. Повторно развернул ресурс !.
KQI

8

Похоже (по состоянию на апрель 2019 г.) AWS API Gateway выдает это исключение по ряду причин - в основном, когда вы попадаете в конечную точку, недоступную для шлюза API Gateway, либо потому, что она не развернута, либо также в тех случаях, когда эта конкретная Метод HTTP не поддерживается.

Я хочу, чтобы шлюз отправлял более подходящие коды ошибок, такие как HTTP 405 Method not supported или HTTP 404 not found, вместо общего HTTP 403 Forbidden.


8

Убедитесь, что вы сначала щелкаете конкретный ресурс в дереве этапов, так как это заполнит URL-адрес полным путем к ресурсу (а не только корневым путем): введите описание изображения здесь

Информацию о других причинах см. На странице http://www.awslessons.com/2017/aws-api-gateway-missing-authentication-token/.


не могли бы вы взглянуть на этот stackoverflow.com/questions/62894455/…
sumanth shetty

@sumanthshetty, пробовали ли вы это решение или любой из остальных ответов здесь? Или вы читали отсюда ссылку на AWS?
cellepo

Я попробовал весь ответ отсюда, а также статью
сумант шетти

6

Убедитесь, что вы создали ресурс, а затем создаете внутри него метод. Это было проблемой для меня. благодаря

введите описание изображения здесь


5

Нашел это в документах:

Если бы использовалась авторизация AWS_IAM, вы бы подписали запрос, используя протоколы Signature Version 4.

Подписание запроса с помощью подписи версии 4


Вы также можете создать SDK для своего API.

Как создать SDK для API в API Gateway

После создания SDK для выбранной платформы на шаге 6 упоминается, что если вы используете учетные данные AWS, запрос к API будет подписан:

  1. Чтобы инициализировать SDK, созданный с помощью шлюза API, с учетными данными AWS, используйте код, подобный приведенному ниже. Если вы используете учетные данные AWS, все запросы к API будут подписаны. Это означает, что вы должны установить соответствующие заголовки CORS Accept для каждого запроса:

    var apigClient = apigClientFactory.newClient({
      accessKey: 'ACCESS_KEY',
      secretKey: 'SECRET_KEY',
    });
    

4

Если вы включили аутентификацию AWS_IAM, вы должны подписать свой запрос учетными данными AWS с помощью AWS Signature Version 4 .

Примечание : вход в консоль AWS не приводит к автоматической подписи запросов вашего браузера к вашему API.


3

иногда это сообщение отображается, когда вы вызываете неправильный API

проверьте свою конечную точку api


2

Я пробую все вышеперечисленное, если вы выполнили все шаги в приведенных выше ответах и ​​не решили проблему, тогда:

  1. в левом меню нажмите "Ресурсы"
  2. справа от «Ресурсы» выберите метод api, который вы хотите протестировать, например «POST / GET и т. д.)
  3. нажмите на список «ДЕЙСТВИЯ» (он находится над методом API на шаге 2
  4. выберите "DEPLOY API" (сделайте это, даже если вы уже развернули свой API)
  5. на «стадии развертывания» выберите «prod» или то, что вы напишете в своем предыдущем развертывании (это переопределит ваше предыдущее развертывание
  6. нажмите развернуть

Я думаю, что из-за того, что когда я создаю «ЗАПРОС МЕТОДА» (см. Шаг 2, как перейти в это меню), в «Авторизация» я выбираю «AWS_IAM» после тестирования api, в варианте тестирования aws, я пробую его в «почтальоне» "то я понимаю, что в" ЗАПРОС МЕТОДА ", в" Авторизация "я должен выбрать" нет "

Я меняю его на none, но, как я объясняю, AWS нужно развернуть снова.


1

Эта ошибка в основном возникает, когда вы вызываете неправильную конечную точку api. Проверьте свою конечную точку api, которую вы вызываете, и проверьте это на шлюзе api.


1

Если вы используете API с конечной точкой типа PRIVATE , убедитесь в следующем:

  1. Вы вызываете API из своей учетной записи AWS (пример: из экземпляра EC2, созданного в вашей учетной записи)

  2. Поместите необходимые учетные данные (доступ и секретные ключи) в экземпляр EC2 в маршрут ~ / .aws / credentials (этот маршрут предназначен для экземпляров linux). Если пользователь IAM использует MFA, также потребуется значение aws_session_token .

  3. Используйте URL-адрес на основе vpce (конечная точка vpc). Пример: curl https://vpce-0c0471b7test-jkznizi5.execute-api.us-east-1.vpce.amazonaws.com/dev/api/v1/status

  4. У вашего экземпляра EC2 есть группа безопасности, которая разрешает исходящий трафик в другую группу безопасности, принадлежащую vpce, например: Экземпляр EC2 sg

  5. Ваша группа безопасности vpce разрешает входящий трафик из другой группы безопасности (предыдущая sg из экземпляра ec2), принадлежащая экземпляру EC2, например: vpce sg

См. Https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-private-apis.html


1

В моем случае это было довольно глупо. Я привык, что новые сущности создаются с помощью POST, и это давало сбой «Missing Authentication Token». Я пропустил это, по какой-то причине он был определен как PUT, который работает нормально.


0

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

Вы даже можете увидеть в своем файле aws.export.js , что есть пути, соответствующие вашему API ['/items'].

Ваш API должен присутствовать там, иначе он не будет добавлять токен безопасности к запросам. Для этого просто зарегистрируйте его в облачной логике вашего проекта в консоли.

Если он есть, используйте вышеупомянутое решение
http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-use-postman-to-call-api.html


0

Для записи, если вы не будете использовать учетные данные, эта ошибка также отображается, когда вы устанавливаете валидатор запроса в методе POST / PUT на «проверку тела, параметров строки запроса и ЗАГОЛОВКИ» или другой вариант «проверка строки запроса» параметры и ЗАГОЛОВКИ ".... в этом случае он будет искать учетные данные в заголовке и отклонять запрос. Подводя итог, если вы не собираетесь отправлять учетные данные и хотите, чтобы они оставались открытыми, вы не должны устанавливать эту опцию в валидаторе запроса (установите для него значение NONE или для проверки тела)


0

Способствовать:

У меня была аналогичная ошибка, потому что мой ответ на возврат не содержал такого «тела»:

return {'statusCode': 200, 'body': "должен содержать тег body, если заменить его не получится"}


0

У меня была такая же проблема, которую я решил следующим образом:

GET Method test

https://54wtstq8d2.execute-api.ap-southeast-2.amazonaws.com/dev/echo/hello
Authorization tab -> 
•   select type(AWS signature)
•   Add AccessKey and SecretKey

0

Если вы настроили роль IAM для своего сервера с разрешением AmazonAPIGatewayInvokeFullAccess, вам все равно нужно передавать заголовки при каждом запросе. Вы можете сделать это в python с помощью библиотеки aws-requests-auth следующим образом:

import requests
from aws_requests_auth.boto_utils import BotoAWSRequestsAuth
auth = BotoAWSRequestsAuth(
    aws_host="API_ID.execute-api.us-east-1.amazonaws.com",
    aws_region="us-east-1",
    aws_service="execute-api"
)
response = requests.get("https://API_ID.execute-api.us-east-1.amazonaws.com/STAGE/RESOURCE", auth=auth)

0

Что ж, для тех, у кого все еще есть проблема, и я действительно чувствую себя очень тупым после того, как осознал это, но я передал URL-адрес по /itemsумолчанию при добавлении api. Но я продолжал называть конечную точку с помощью /api. Отдельное спасибо Carlos Alberto Schneider, так как я понял свою проблему после прочтения вашего сообщения.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.