отримання повідомлення: заборонена відповідь від шлюзу API AWS


79

Я намагаюся створити лямбда-службу на AWS і отримати доступ до неї ззовні через шлюз API без автентифікації та обмежень.

Щоб полегшити ситуацію, я встановив, що шлюз наразі є макет.

У методі Get API API для авторизації встановлено значення, Noneа ключ API - not required.

Коли я спробую це, я отримую {"message":"Forbidden"} (те саме повідомлення, якщо я підключаю його до власне лямбда-сервісу).

Будь-яка порада, як зробити це доступним?


2
Ви додавали метод get до розгортання?
Cenxui

1
Цікаво, у вас немає правильної URL-адреси виклику.
Ка Хо Іон

4
Я не можу проголосувати за це питання, але хотів би це зробити. відповіді "щось подібне-те" не допомагають громаді. Я експериментував із забороненими повідомленнями через поганий відступ у моєму файлі serverless.yml.
Перімош,

12
Будь ласка, поставте галочку біля правильної відповіді, а не додайте [solved]до свого запитання. Дякую!
Тім Малоун

2
Було б корисно, якщо б ви пояснили, що сталося не так і як ви це виправили.
Еппіло

Відповіді:


89

Якщо ви встановите для параметра "Необхідний ключ API" значення true, перевірте нижче.

  1. вам потрібно передати параметр заголовка HTTP 'x-api-key' шлюзу API.
  2. Потрібно було створити ключ API.
  3. Крім того, вам потрібно перевірити План використання ключа API на консолі шлюзу API.

3
Дякую, Даніеле, твій третій крок дозволяє мені виправити помилку.
Гектор Магана

6
Це спрацювало для мене, але це мав бути "X-Api-Key". Схоже, великі літери мають значення
pixelwiz

3
Всі три кроки зробили це для мене. Я вже створив ключ API, але не прив’язав його до плану використання чи чогось іншого. Дуже дякую!
sidewaiise

7
Пункт 3 у вашій відповіді часто ігнорується. Це виявилося моєю проблемою.
Еппіло

1
@Marecky та pixelwiz, я просто мав справу з подібною проблемою, і, щоб додати досвід pixelwiz, у мене була та сама проблема. Після пошуку я виявив, що шлюз API AWS має "відому проблему", через яку заголовки обробляються INDEED у "регістрі". Перегляньте нижню частину цієї сторінки: docs.aws.amazon.com/apigateway/latest/developerguide/…
JasonBub

60

На інформаційній панелі шлюзу API виберіть Ресурси, клацніть Дії та виберіть Розгортання API. До вашого першого розгортання єдиною відповіддю, яку ви отримаєте, є {"message":"Forbidden"}.


12
Я б додав до цього, після розгортання переконайтеся, що ви додали своє ім’я сцени до URL-адреси: abcdefg.execute-api.us-east-2.amazonaws.com/STAGE_NAME/
user2465134

37

Якщо ви використовуєте власне доменне ім’я та забудете вибрати інтерактивну проміжку призначення, ви отримаєте Forbiddenповідомлення.

Просто перейдіть Custom Domain Namesі натиснітьEdit вашого домену на ньому, а потім виберіть етап під Base Path Mappings.


1
Чудово працює, і обов’язково слідкуйте за відповіддю @ jneves та (повторно) розгортайте. після встановлення відображення воно не відображалося, поки я не передислокував етап, який я вибрав із зіставлення базового шляху.
Кальвін Шеманскі

12

Вам потрібно розгорнути свій api на сцені та використовувати url сцени, перейти до Ресурсів, клацнути Дії та вибрати Розгорнути API

Тепер, якщо ви отримуєте помилку

{"message": "Заборонено"}.

Будь ласка, перевірте наступні кроки

1) Якщо ви ввімкнете копіювання ключа api і передасте свій ключ поштарці

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

2) Тепер ви все ще отримуєте ту саму помилку, означає, що вам потрібно буде створити план використання

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

3) встановити ліміт і призначити план своєму API

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


не бачу зображень
альбатрос

8

У мене була подібна проблема, і у мене було таке:

  1. Спеціальний домен (Edge Optimized)
  2. Багато етапів (розробник, постановка, прод)

Я також не встановлював авторизації та обмежень, щоб спростити ситуацію.

Я зміг усунути проблему, додавши відображення базового шляху для кожного з моїх етапів (розробник, інтерактивний, продуктовий).


У мене були однакові основні налаштування з декількома API. Цікаво, що, хоча насправді було розгорнуто лише один з моїх API, я отримував "Заборонено", доки не встановив відображення базового шляху для нерозгорнутих API.
Ден,

5

Якщо ви встановили для ключа API API значення true, вам потрібно передати ключ api як заголовок.

Ключ API передається як поле заголовка 'x-api-key'. Навіть після додавання цього поля в заголовок ця проблема може виникнути. У цьому випадку, будь ласка, підтвердьте нижче пункти

  • У вас є план використання? якщо не потрібно створити.
  • Пов’яжіть ваш API із планом використання. Для цього додайте етап, він зв’яже ваш API.
  • У вас є ключ API? якщо ні, то вам потрібно створити API-ключ і ввімкнути його.
  • Додайте до цього ключа API план використання, який пов’язаний з вашим API. Для цього додайте План використання.

5

Можливо, я запізнився, але одна з причин, через яку шлюз API видає "заборонене" повідомлення, полягає в тому, що ви передаєте дані в тілі запиту на операцію GET. Для вирішення проблеми або зробіть свій ресурс POST, або ви не передасте дані в тіло запиту.


Використовував Insomnia і змінив мій запит з POST на GET. Тип запиту все ще був GraphQL Query- що повернуло 403 заборонену помилку. Зміна типу запиту з GraphQL Queryна No Bodyзробило трюк!
naribo

Ти врятував мені життя!
hirikarate

5

Це може бути далеко не очевидно, але ще однією причиною появи помилки "Заборонено" під час використання шлюзу API AWS може бути виклик неправильної URL-адреси, яка не відповідає жодному розгорнутому методу API. Це може статися, якщо ви насправді натискаєте неправильну URL-адресу (наприклад, замість того, щоб дзвонити https://9999xx9x99.execute-api.us-east-1.amazonaws.com/dev/users( devстадія примітки раніше users), яку ви телефонували https://9999xx9x99.execute-api.us-east-1.amazonaws.com/users(без стадії). Ви очікували б отримати 404, але отримаєте 403.

ДО: після того, як ви здійсните розгортання для https://9999xx9x99.execute-api.us-east-1.amazonaws.com/dev/usersвиклику https://9999xx9x99.execute-api.us-east-1.amazonaws.com/user(тут зверніть увагу на форму однини іменника), ви також отримаєте ... 403, але з повідомленням "Відсутній маркер автентифікації"!


Це може бути далеко не очевидно, але ще однією причиною появи помилки "Заборонено" під час використання шлюзу API AWS може бути виклик неправильної URL-адреси, яка не відповідає жодному розгорнутому методу API. Це може статися, якщо ви насправді натискаєте неправильну URL-адресу (наприклад, замість того, щоб викликати 9999xx9x99.execute-api.us-east-1.amazonaws.com/dev/users (зверніть увагу на стадію розробника перед користувачами), яку ви викликали 9999xx9x99.execute-api. us-east-1.amazonaws.com/users (без етапу). Ви очікували б отримати 404, але отримаєте 403. Як вирішити цю проблему в рубіновій стійці aws lambda api gateway endpoint?
Ankita Dhandha

@AnkitaDhandha, поставте нове запитання.
божевільний

3

Якщо Authorizationі API KEY Requiredобидва встановлені істина для даного методу, то переконаєтеся , що ви такі заголовки при відправці запиту:

  1. Тип вмісту (зазвичай application / x-www-form-urlencoded, якщо GET виклик)
  2. ВЕДУЧИЙ
  3. X-Amz-Date
  4. Авторизація
  5. x-api-ключ

Я використовую POSTMANдля тестування API, яке є досить надійним, і тоді це досить приємно.

Примітка: Не додавайте заголовок клавіші x-api, якщо ви встановили API KEY REQUIREDяк FALSE. І якщо ви встановили AUTHORIZATIONяк FALSE, тоді не додайте заголовок Authorization.


3

Єдина інша причина, з якою я зіткнувся, але не бачу, що тут згадується, це буквально те, що ви намагалися зв’язатися з API занадто швидко після публікації. Я натиснув "Публікувати" і побачив доменне ім'я "ваш API доступний", і негайно скопіював і вставив його в Postman, щоб перевірити це.

Я отримую заборонене повідомлення. Нічого не міняйте. Перевірте всі налаштування, щоб переконатися, що я нічого не зробив - все правильно. Начебто вириваю моє волосся.

Поверніться через кілька хвилин, щоб спробувати, бо я впевнений, що все роблю правильно - це працює.

DNS людина. Яким би швидким не був Інтернет - це не миттєво :)


2

Я отримав цю помилку від служби nginx fargate, намагаючись отримати доступ до приватного API у шлюзі API. Мені потрібно було додати політику до політики ресурсів у моєму api, як це

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-east-1:<AccountID>:<RestApiID>/*",
            "Condition": {
                "StringEquals": {
                    "aws:sourceVpce": "<VPC Endpoint ID for execute-api>"
                }
            }
        }
    ]
}

2

Є кілька речей, які потрібно зробити, коли ми отримуємо {message: заборонено} у шлюзі API:

CORS увімкнено?

  1. Перевірте, чи ввімкнено CORS в API (для початку дозвольте походження '*', щоб переконатися, що ми можемо безпечно протестувати)
  2. Розгорніть API, щоб переконатися, що всі налаштування відповідають очікуваним

Ключ API увімкнено?

  1. Перевірте, чи ввімкнено ключ API у шлюзі API
  2. Перевірте, чи налаштовано ключ API.
  3. Перевірте, чи ваш ключ API присвоєний правильному плану використання, і додайте API Stage, без API Stage ви завжди отримаєте {message: заборонено}

Якщо ви все ще стикаєтесь із проблемами, повідомте мене, щоб я чи хтось із наших хмарних гуру @levarne міг допомогти.


2

Я міг натрапити на вирішення цієї проблеми. У мене була та сама проблема зараз на MacOS. Я спробував очистити свій DNS, і тоді це спрацювало!

Спробуйте це в терміналі:

Mac OS X Yosemite і пізніших версій

sudo killall -HUP mDNSResponder

Mac OS X Yosemite v10.10 - v10.10.3

sudo discoveryutil mdnsflushcache

Mac OS X Mavericks, Гірський Лев та Лев

sudo killall -HUP mDNSResponder

Mac OS X Snow Leopard

sudo dscacheutil -flushcache

1

Локальний брандмауер / антивірус або NGIPS ( Cisco Bluecoat ). Останнє було моїм випадком, коли я навіть не отримував журнали в CloudWatch зі свого API. Це дозволило розміщення мого веб-сайту, розміщеного на домені верхнього рівня, але блокувало apiпіддомен 403 , не маючи основного вмісту на вкладці інструментів розробника мережі.


1

Я потрапив {"message":"Forbidden"}в API, для EndpointConfiguration встановлений PRIVATE, і VpcEndpoint, створений для нього в приватних підмережах Vpc (це міжсервісний API)

Причиною цього {"message":"Forbidden"}стало те, що у мене склалося враження, що я повинен використовувати одну з URL-адрес VpcEndpoint. Використовувана URL-адреса все ще є тією, що пов'язана зі стадією (у консолі ApiGateway). Це є:

https://${RestApiId}.execute-api.${Region}.amazonaws.com/${StageName}


0

Ми зіткнулися з цією проблемою у своєму виробництві, коли використовували Kong як наш шлюз API. Наші запити передавались, коли їх ініціював Postman, але не вдалося виконати 403, коли було ініційовано через Код. Увімкнено плагін Bot у Kong, який дозволяв лише запити, ініційовані з браузера або мобільної програми на основі значення заголовка агента користувача. Наші запити, ініційовані за допомогою клієнта Http, не вдалося. Як тільки ми вимкнули плагін бота, помилка не сталася. Тепер він дозволяє запит, якщо агентом користувача є Apache-HttpClient / 4.5.2 (Java / 1.8.0_91).


0

Поміщаючи тут свій досвід. Я спробував усі ці речі вище, і виявилося, що розміщення домену з підстановочним знаком вирішило мою проблему {"message": "Forbidden"} : * .mydomain.com

Спеціальний домен


0

Лише примітка щодо подібного випадку, з яким я зіткнувся з редактором Swagger:

  • Я експортував OpenAPI 3.0 YAML із шлюзу API → Етапи → виберіть «Prod» → виберіть вкладку «Експорт» → перемкніть перемикач на «OpenAPI 3» → «Експортувати як розширення шлюзу OpenAPI 3 + API»
  • Вставте отриманий YAML на https://editor.swagger.io/
  • Виконати тривіальний метод GET.
  • Він повертається 403 Forbiddenразом з {"message":"Forbidden"}тілом.

curl команда з редактора Swagger виглядала так:

curl -X GET "https://xxx52xxxx9.execute-api.eu-central-1.amazonaws.com//Prod/users" -H "accept: application/json"

(зверніть увагу на дубль //раніше Prod).

І та сама curlкоманда без //роботи через командний рядок!

Фокус, який спрацював, полягає в тому, щоб замінити цю serverструктуру, повернуту в згенерованому шлюзом API:

servers:
  - url: "https://xxx52xxxx9.execute-api.eu-central-1.amazonaws.com/{basePath}"
    variables:
      basePath:
        default: "/Prod"

З повним urlбез variables:

servers:
  - url: "https://xxx52xxxx9.execute-api.eu-central-1.amazonaws.com/Prod"

Примітно, що видалення косої риски з default: "/Prod"не допомогло.


0

У моєму випадку ключ api не був увімкнений. Переконайтесь, що API встановлено як Увімкнено. введіть тут опис зображення


0

Як згадують @ gary69 та @Adriaan Pelzer

https://stackoverflow.com/a/52727654/809043

https://stackoverflow.com/a/55136675/809043

Ви можете отримати повідомлення {"message": "Forbidden"} під час запиту на приватний API.

Отже, якщо у вас є установка, де весь трафік повинен проходити ретельну кінцеву точку API, яка потім спрямовує трафік до шлюзу API, тоді можуть бути використані такі параметри.

APIGatewayVPCEndpoint:
  Type: 'AWS::EC2::VPCEndpoint'
  Properties:
    PolicyDocument: '{
        "Version":"2012-10-17",
        "Statement":[{
          "Effect":"Allow",
          "Principal": "*",
          "Action":["execute-api:Invoke"],
          "Resource":["arn:aws:execute-api:eu-north-1:000000000000:*/*"]
        }]
      }'
  ...
  VpcEndpointType: Interface
  PrivateDnsEnabled: true

Якщо увімкнено PrivateDnsEnabled, кінцева точка в Шлюзі API повинна мати тип Private, і потрібно додати політику.

  ApiGatewayRest:
    Type: AWS::ApiGateway::RestApi
    Properties:
      Description: A mocked API
      Name: Mocked API
      EndpointConfiguration:
        Types:
          - PRIVATE
      Policy: '{
        "Version": "2012-10-17",
        "Statement": [{
          "Effect": "Allow",
          "Principal": "*",
          "Action": "execute-api:Invoke",
          "Resource": "arn:aws:execute-api:eu-north-1:000000000000:*/*/*/*"
        }]
      }'

Ця тема форуму допомогла мені з’ясувати деякі деталі

https://forums.aws.amazon.com/thread.jspa?threadID=286760


0

У мене була подібна проблема. Виявилося, що мій сертифікат у менеджері сертифікатів не був створений у регіоні Північна Вірджинія (США -схід-1 ), тому я не міг позначити власний домен як оптимізований Edge. Мені довелося вибрати регіональний.

Коли я повторно імпортував сертифікат, використовуючи регіон Північної Вірджинії, і знову створив власний домен, але цього разу з оптимізованою Edge конфігурацією кінцевої точки, він працював бездоганно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.