API Gateway에 액세스하는 동안 인증 토큰이 누락 되었습니까?


82

AWS API Gateway를 통해 Lambda 함수를 호출하려고합니다. 인증 유형 NONE을 언급하면 ​​제대로 작동하지만 API가 공개되고 URL이있는 모든 사용자가 내 API에 액세스 할 수 있습니다. API 호출을 안전하게 만들기 위해 인증 유형 AWS_IAM을 사용하고 있으며 AmazonAPIGatewayInvokeFullAccess 정책을 사용자에게 연결했지만이 오류가 발생합니다.

{ message: "Missing Authentication Token"}

내가 여기서 무엇을 놓치고 있는지 모르겠습니다.


여기에 나와있는 대부분의 답변은 지정된 API 게이트웨이 리소스 엔드 포인트 뒤에 매핑 된 다른 AWS 서비스 (예 : DynamoDB)에서도 작동 할 것이라고 생각합니다. 이것이 사실이라고 가정하면 API Gateway는 여기에서 작동하는 인터페이스입니다 (AWS 서비스 리소스가 아님).
cellepo

오류는 잘못된 엔드 포인트를 입력 한 결과입니다
Rexben

답변:


40

API 링크에 직접 액세스하려고하는 것 같습니다. API가 IAM 역할을 사용하여 보호되고 AWS 인증, 즉 액세스 키 및 비밀 키를 제공해야하기 때문에 작동하지 않습니다.

Postman Chrome 확장 프로그램을 사용하여 API를 테스트하십시오. http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-use-postman-to-call-api.html


안녕하세요, Saddam, SOAP UI에서 AWS 인증을 수행하는 방법. POSTMAN에서는 매우 쉽습니다. SOAP UI에서도 비슷한 방법이 있습니까?
Pankaj Sharma

154

어리석은 이유로 시간을 잃었습니다.

단계를 만들 때 표시된 링크에는 URL의 리소스 부분이 포함되지 않습니다.

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

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

/ 얻을 목록은 실종됐다

물론 메서드 구성이 다음과 같은지 확인해야합니다.

여기에 이미지 설명 입력


11
문제에 대한 어리석은 (그러나 일반적인) 이유를 인정하려면 특별한 칭찬이 필요합니다. 이것은 나도 얻었습니다.
Jeff Richards

죄송합니다. 의미를 이해하지 못했습니다. 게시 요청이 인증을 사용하도록 설정되었는지 확인하려면 생성 한 리소스 아래에서 POST 옵션을 클릭해야합니다 (예 : / my-). 리소스의 사후 호출에는 OPTION 및 POST 메서드가 있습니다. POST를 클릭 한 다음 방법 구성에서 인증이 필요한지 확인할 수 있습니다. 그러나 포스트 호출에 대한 전체 URL을 얻으려면 API URL + 리소스 가져 오기와 동일한 방식으로 작동합니다 (예 : 1111.execute-api.us-east-1.amazonaws.com/dev/my-). POS-tcall
카를로스 알베르토 슈나이더

2
나를 괴롭힌 관련하고 멍청한 일 : HTTP 동사가 올바른지 확인하십시오. 실수로 POST 대신 GET을 보냈습니다. 경로와 동사가 정확히 일치하지 않는 경로에서이 오류가 발생하는 것 같습니다 .
Josh1billion

ThanX 많이 !! 당신이 언급했을 때 너무 간단합니다. 나는 몰랐다. 고마워요!
ylev

FWIW에서 먼저 스테이지 트리에서 리소스 자체 (이 경우 GET)를 클릭하면 해당 리소스의 전체 URL이 직접 표시되어야한다고 생각합니다. 내 관련 답변의 자세한 내용과 설명 사진 : stackoverflow.com/a/60858537/1357094
cellepo

21

방금 동일한 문제가 발생했으며 리소스를 찾을 수없는 경우에도이 메시지가 표시되는 것 같습니다.

제 경우에는 API를 업데이트했지만 재배포하는 것을 잊었습니다. 업데이트 된 API를 내 스테이지에 배포 한 후 문제가 해결되었습니다.


그것이 내가 작동하게 된 방법입니다. 리소스를 재배치했습니다!.
KQI

7

(2019 년 4 월 현재) AWS API Gateway는 다양한 이유로이 예외를 throw합니다. 대부분 API Gateway가 배포되지 않았거나 특정 상황이 발생하여 도달 할 수없는 엔드 포인트에 도달 할 때 HTTP 메서드는 지원되지 않습니다.

게이트웨이가 일반 HTTP 403 금지 대신 HTTP 405 메서드가 지원되지 않거나 HTTP 404를 찾을 수 없음과 같은 더 적절한 오류 코드를 보내길 바랍니다.


7

스테이지 트리에서 특정 리소스를 먼저 클릭해야합니다. 그러면 URL 이 리소스에 대한 전체 경로 (루트 경로가 아닌) 채워집니다 . 여기에 이미지 설명 입력

다른 원인은 http://www.awslessons.com/2017/aws-api-gateway-missing-authentication-token/을 참조하십시오 .



@sumanthshetty이 솔루션을 시도 했습니까, 아니면 나머지 답변을 여기에 있습니까? 아니면 여기에서 AWS 링크를 읽었습니까?
cellepo

나는 여기와 또한 기사에서 모든 대답을 시도했습니다
sumanth shetty

6

Resource를 생성 한 다음 그 안에 메소드를 생성해야합니다. 그게 제 문제였습니다. 감사

여기에 이미지 설명 입력


5

문서에서 이것을 찾았습니다.

AWS_IAM 권한이 사용 된 경우 서명 버전 4 프로토콜을 사용하여 요청에 서명합니다.

서명 버전 4로 서명 요청


API 용 SDK를 생성 할 수도 있습니다.

API Gateway에서 API 용 SDK를 생성하는 방법

선택한 플랫폼 용 SDK를 생성 한 후 6 단계에서는 AWS 자격 증명을 사용하는 경우 API에 대한 요청이 서명 될 것이라고 언급합니다.

  1. AWS 자격 증명으로 API Gateway 생성 SDK를 초기화하려면 다음과 유사한 코드를 사용하십시오. AWS 자격 증명을 사용하는 경우 API에 대한 모든 요청이 서명됩니다. 즉, 각 요청에 대해 적절한 CORS Accept 헤더를 설정해야합니다.

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

4

AWS_IAM 인증을 활성화하는 경우 AWS 서명 버전 4를 사용하여 AWS 자격 증명으로 요청에 서명해야합니다. .

참고 : AWS 콘솔에 로그인해도 API에 대한 브라우저의 요청에 자동으로 서명되지는 않습니다.


3

때때로 잘못된 API를 호출 할 때이 메시지가 표시됩니다.

API 끝점 확인


2

위의 답변의 모든 단계를 수행했지만 문제를 해결하지 못하면 위의 모든 것을 시도합니다.

  1. 왼쪽 메뉴에서 "리소스"를 누르십시오.
  2. "Resources"의 오른쪽에서 "POST / GET 등과 같이 테스트하려는 API 메소드를 누르십시오.)
  3. "ACTION"목록을 누르십시오 (2 단계의 API 메소드 위에 있습니다.
  4. "DEPLOY API"를 선택하십시오 (이미 API를 배포 한 경우에도 수행하십시오).
  5. "배포 단계"에서 "prod"또는 이전 배포에 작성한 내용을 선택합니다 (이전 배포를 재정의합니다).
  6. 히트 배포

"METHOD REQUEST"(2 단계이 메뉴로 이동하는 방법 참조)를 만들 때 "Authorization"에서 api를 테스트 한 후 "AWS_IAM"을 선택하고 aws 테스트 옵션에서 "postman "그런 다음"방법 요청 "에서"승인 "에서"없음 "을 선택해야 함을 이해합니다.

없음으로 변경했지만 AWS에 관심이 있습니다. 설명했듯이 다시 배포해야합니다.


1

이 오류는 대부분 잘못된 API 끝점을 호출 할 때 발생합니다. 호출중인 API 엔드 포인트를 확인하고 api 게이트웨이에서이를 확인하십시오.


1

엔드 포인트 유형이 PRIVATE 인 API를 사용하는 경우 다음을 확인하십시오.

  1. AWS 계정 내에서 API를 호출하는 경우 (예 : 계정에서 생성 된 EC2 인스턴스에서)

  2. 필요한 자격 증명 (액세스 및 비밀 키)을 ~ / .aws / credentials 경로의 EC2 인스턴스에 넣습니다 (이 경로는 Linux 인스턴스 용입니다). IAM 사용자가 MFA를 사용하는 경우 aws_session_token 값도 필요합니다.

  3. vpce (vpc 끝점) 기반 URL을 사용합니다. 예 : curl https://vpce-0c0471b7test-jkznizi5.execute-api.us-east-1.vpce.amazonaws.com/dev/api/v1/status

  4. EC2 인스턴스에는 다음과 같이 vpce가 소유 한 다른 보안 그룹으로의 아웃 바운드 트래픽을 허용하는 보안 그룹이 있습니다. EC2 인스턴스 SG

  5. vpce 보안 그룹은 다음과 같이 EC2 인스턴스가 소유 한 다른 보안 그룹 (ec2 인스턴스의 이전 sg)의 인바운드 트래픽을 허용합니다. vpce sg

참조 : https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-private-apis.html


0

먼저 lamda 함수에서 생성 한 API가 AWS 프로젝트에 등록되어 있는지 확인하십시오. 이를 위해 AWS 콘솔의 API 게이트웨이로 이동하십시오. 등록되지 않은 경우 등록하십시오. 이것이이 문제의 주요 원인입니다.

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 유효성 검사"로 설정하거나 다른 옵션 "쿼리 문자열 유효성 검사" 로 설정하는 경우에도이 오류가 표시됩니다. parameters and HEADERS "....이 경우 헤더에서 자격 증명을 찾고 요청을 거부합니다. 요약하자면, 자격 증명을 보내지 않고 열어 두려면 요청 유효성 검사기에서 해당 옵션을 설정하지 않아야합니다 (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

AmazonAPIGatewayInvokeFullAccess 권한이있는 서버에 대한 IAM 역할을 설정 한 경우에도 각 요청에서 헤더를 전달해야합니다. 다음과 같이 aws-requests-auth 라이브러리를 사용하여 Python에서이 작업을 수행 할 수 있습니다 .

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

제 경우에는 꽤 어리석은 일이었습니다. 새 엔티티가 POST를 사용하여 생성되고 "Missing Authentication Token"으로 실패한다는 사실을 알고 있습니다. 나는 어떤 이유로 그것이 잘 작동하는 PUT로 정의되었음을 놓쳤다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.