Відсутній маркер автентифікації під час доступу до шлюзу API?


86

Я намагаюся викликати лямбда-функцію через шлюз API AWS. Коли я згадую тип автентифікації NONE, це працює нормально, але API стає загальнодоступним, і кожен, хто має URL-адресу, може отримати доступ до мого API. Щоб зробити виклик API безпечним, я використовую тип автентифікації AWS_IAM, а також приєднав політику AmazonAPIGatewayInvokeFullAccess до мого користувача, але отримую цю помилку:

{ message: "Missing Authentication Token"}

Я не знаю, чого мені тут не вистачає.


Я вважаю, що більшість, якщо не всі відповіді тут, також будуть працювати для будь-якої іншої служби AWS (тобто: також DynamoDB), що відображається за даною кінцевою точкою ресурсу шлюзу API. Якщо припустити, що це правда, API-шлюз тут є оперативним інтерфейсом (а не службовим ресурсом AWS).
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?
Панкадж Шарма

174

Я втратив трохи часу з дурної причини:

Коли ви створюєте етап, відображене посилання не містить ресурсної частини URL-адреси:

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

URL-адреса API + РЕСУРС https://1111.execute-api.us-east-1.amazonaws.com/dev/get-list

/ Отримати-лист пропускав

І звичайно, вам потрібно перевірити, чи конфігурація методу виглядає так:

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


14
для визнання дурних (але загальних) причин проблеми потрібні спеціальні похвали. Це мене теж зрозуміло.
Джефф Річардс,

Вибачте, я не зрозумів, що ви мали на увазі. Якщо ви хочете перевірити, чи налаштовано запит на публікацію для використання автентифікації, вам потрібно натиснути на опцію POST у створеному вами ресурсі, наприклад, ви можете мати / my- післядзвінок у ваших ресурсах, і під ним ви маєте методи OPTION та POST. Клацніть на POST, а потім у конфігурації методу ви побачите, чи потрібна автентифікація. Але якщо ви хочете отримати повну URL-адресу для виклику після повідомлення, це працює так само, як URL-адреса отримання API + РЕСУРС, наприклад, 1111.execute-api.us-east-1.amazonaws.com/dev/my- pos-tcall
Карлос Альберто Шнайдер

2
Пов’язана безглузда річ, яка мене спокусила: переконайтесь, що ваше дієслово HTTP правильне. Я помилково надсилав GET замість POST. Здається, ви отримаєте цю помилку на будь-якому маршруті, який не збігається точно як з точки зору шляху, так і дієслова.
Josh1billion

ThanX багато !! Це так просто, коли ви про це згадали. Я не усвідомлював. Дякую, чоловіче!
ylev

FWIW, натиснувши на сам Ресурс (в даному випадку GET) спочатку в дереві Stages, я вважаю, повинен відкрити повну URL-адресу цього ресурсу безпосередньо. Більш детальна інформація та пояснювальний ПІК в моєму пов'язаної Відповідь: stackoverflow.com/a/60858537/1357094
cellepo

21

У мене просто була та сама проблема, і, схоже, вона також відображає це повідомлення, якщо ресурс не вдається знайти.

У моєму випадку я оновив API, але забув передислокуватися. Проблема була вирішена після розгортання оновленого API на моїй стадії.


Ось так я змусив це працювати. Повторно розгорнув ресурс !.
KQI

8

Схоже (станом на квітень 2019 р.) Шлюз API AWS видає цей виняток з різних причин - здебільшого, коли ти потрапляєш на кінцеву точку, до якої Шлюз API не може досягти, або через те, що він не розгорнутий, а також у випадках, коли Метод HTTP не підтримується.

Я бажаю, щоб шлюз надсилав більш відповідні коди помилок, такі як HTTP 405 Метод не підтримується або HTTP 404 не знайдений, замість загального HTTP 403 Заборонено.


8

Переконайтеся, що натискаєте конкретний Ресурс спочатку в дереві Stages, оскільки це заповнить URL-адресу повним шляхом до ресурсу (а не лише кореневим шляхом): введіть тут опис зображення

Інші причини див. На http://www.awslessons.com/2017/aws-api-gateway-missing-authentication-token/


Ви могли б поглянути на цю stackoverflow.com/questions/62894455 / ...
Самант Шетті

@sumanthshetty ви пробували це рішення чи будь-яку іншу відповідь тут? Або ви читали посилання AWS звідси?
cellepo

я спробував усі відповіді звідси, а також статтю
Сумант Шетті

6

Обов’язково створіть ресурс, а потім створіть метод усередині нього. Це було питання для мене. Дякую

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


5

Знайшов це в документах:

Якщо було використано дозвіл AWS_IAM, ви підписали б запит, використовуючи протоколи Signature Version 4.

Запит на підписання підписом версії 4


Ви також можете створити SDK для свого API.

Як створити SDK для API у шлюзі API

Після створення 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 версії 4 .

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


3

іноді це повідомлення відображається, коли ви викликаєте неправильний API

перевірте свою кінцеву точку API


2

Я намагаюся все вищезазначене, якщо ви виконали всі кроки у наведених вище відповідях і не вирішили проблему, тоді:

  1. у меню ліворуч натисніть "Ресурси"
  2. праворуч від "Ресурси", натисніть метод api, який ви хочете протестувати, наприклад "POST / GET тощо)
  3. натисніть "ACTION" (це вище, ніж метод API на кроці 2
  4. виберіть "DEPLOY API" (будь ласка, зробіть це, навіть якщо ви вже розгортаєте свій api)
  5. на "етапі розгортання" виберіть "prod" або те, що ви коли-небудь писали у своєму попередньому розгортанні (це замінить ваше попереднє розгортання
  6. хіт розгорнути

Мені здається, що через те, що, коли я створюю "ЗАПИТ МЕТОДУ" (див. Крок 2, як перейти до цього меню), в "Авторизація" я вибираю "AWS_IAM" після тестування api, у варіанті тестування aws, я пробую це в "листоноші" "тоді я розумію в" МЕТОД ЗАПИТ ", в" Авторизація ", я повинен вибрати" немає "

Я змінюю його на нічого, але, як я пояснюю, 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, і це не вдалося з "Відсутній маркер автентифікації". Я пропустив, що з якихось причин це було визначено як PUT, який працює нормально.


0

Перш за все, перевірте, зареєстрований у вашому проекті AWS API, який ви створили у функції lamda. Для цього перейдіть до шлюзу 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 до «валідації тіла, параметри рядка запиту і HEADERS», або інший варіант «рядки запиту Validate параметри та ЗАГОЛОВКИ ".... у такому випадку він буде шукати облікові дані в заголовку та відхиляти запит. Підводячи підсумок, якщо ви не маєте наміру надсилати облікові дані і хочете тримати їх відкритими, не слід встановлювати цю опцію у валідаторі запитів (встановіть її як NONE або для перевірки основного тексту)


0

Робити внесок:

У мене була подібна помилка, тому що моя відповідь на повернення не містила "тіла", як це:

return {'statusCode': 200, 'body': "повинен містити тег body, якщо ви заміните це не буде працювати"}


0

У мене була та сама проблема, яку я вирішив наступним чином:

Тест методу GET

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-request-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

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

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