API Gatewayへのアクセス中に認証トークンがありませんか?


85

AWS APIGatewayを介してLambda関数を呼び出そうとしています。認証タイプNONEについて言及すると、正常に機能しますが、APIは公開され、URLを持っている人なら誰でも私のAPIにアクセスできます。API呼び出しを安全にするために、認証タイプAWS_IAMを使用しており、AmazonAPIGatewayInvokeFullAccessポリシーをユーザーにアタッチしていますが、次のエラーが発生します。

{ message: "Missing Authentication Token"}

ここで何が欠けているのかわかりません。


ここでのすべてではないにしても、ほとんどの回答は、特定のAPIゲートウェイリソースエンドポイントの背後にマッピングされた他のAWSサービス(つまり、DynamoDB)でも機能すると思います。それが真実であると仮定すると、API Gatewayはここでの運用インターフェースです(AWSサービスリソースではありません)。
cellepo

エラーは、間違ったエンドポイントにヒットした結果です
Rexben 2010

回答:


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認証をSOAPuiで実行する方法。POSTMANでは、非常に簡単です。SOAP UIにも同様の方法がありますか?
PankajSharma19年

173

私は愚かな理由で時間を失いました:

ステージを作成すると、表示されるリンクにはURLのリソース部分が含まれません。

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

API +リソースURLhttps ://1111.execute-api.us-east-1.amazonaws.com/dev/get-list

/取得-リストが欠落していました

そしてもちろん、メソッド構成が次のようになっていることを確認する必要があります。

ここに画像の説明を入力してください


14
問題のばかげた(しかし一般的な)理由を認めるには、特別な称賛が必要です。これは私にもなりました。
ジェフ・リチャーズ

申し訳ありませんが、意味がわかりませんでした。POSTリクエストが認証を使用するように設定されているかどうかを確認する場合は、作成したリソースの下にあるPOSTオプションをクリックする必要があります。たとえば、/ my-があります。リソースのポストコール。その下に、OPTIONメソッドとPOSTメソッドがあります。POSTをクリックすると、メソッド構成で、認証が必要かどうかを確認できます。ただし、ポストコールの完全なURLを取得する場合は、get API URL + RESOURCEと同じように機能します(例: 1111.execute-api.us-east-1.amazonaws.com/dev/my-)。 pos-tcall
カルロスアルベルトシュナイダー

2
私をつまずかせた関連する愚かなこと:HTTP動詞が正しいことを確認してください。誤ってPOSTではなくGETを送信していました。パスと動詞の両方が完全に一致しないルートでは、このエラーが発生するようです。
Josh1billion

どうもありがとう !!あなたがそれを言ったとき、それはとても簡単です。気づかなかった。ありがとうございます!
ylev

FWIW、ステージツリーで最初にリソース自体(この場合はGET)をクリックすると、そのリソースの完全なURLが直接表示されるはずです。私の関連する回答の詳細と説明写真: stackoverflow.com/a/60858537/1357094
cellepo 2010年

21

同じ問題が発生しましたが、リソースが見つからない場合にもこのメッセージが表示されるようです。

私の場合、APIを更新しましたが、再デプロイするのを忘れていました。更新されたAPIをステージにデプロイした後、この問題は解決されました。


それが私がそれを機能させる方法です。リソースを再デプロイしました!。
KQI

8

(2019年4月現在)AWS API Gatewayは、さまざまな理由でこの例外をスローしているようです-主に、API Gatewayがデプロイされていないために到達できないエンドポイントに到達した場合、またはその特定の場合にHTTPメソッドはサポートされていません。

ゲートウェイが、一般的なHTTP 403 Forbiddenの代わりに、HTTP 405メソッドがサポートされていない、HTTP404が見つからないなどのより適切なエラーコードを送信することを望みます。


8

ステージツリーで最初に特定のリソースをクリックしていることを確認してください。これにより、URLに(ルートパスだけでなく)リソースへのフルパスが入力されます。 ここに画像の説明を入力してください

その他の原因については、http: //www.awslessons.com/2017/aws-api-gateway-missing-authentication-token/を参照してください。



@sumanthshettyこのソリューション、またはここにある残りの回答のいずれかを試しましたか?または、ここからAWSリンクを読みましたか?
cellepo

私はここからのすべての答えと記事も
試しました

6

必ずリソースを作成してから、その中にメソッドを作成してください。それが私にとっての問題でした。ありがとう

ここに画像の説明を入力してください


5

ドキュメントでこれを見つけました:

AWS_IAM認証が使用された場合は、Signatureバージョン4プロトコルを使用してリクエストに署名します。

署名バージョン4を使用した署名要求


API用のSDKを生成することもできます。

APIGatewayでAPIのSDKを生成する方法

選択したプラットフォーム用のSDKを生成すると、ステップ6で、AWS認証情報を使用している場合、APIへのリクエストが署名されることが示されます。

  1. API Gatewayで生成されたSDKをAWS認証情報で初期化するには、次のようなコードを使用します。AWS認証情報を使用する場合、APIへのすべてのリクエストは署名されます。これは、リクエストごとに適切なCORSAcceptヘッダーを設定する必要があることを意味します。

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

4

AWS_IAM認証を有効にする場合は、AWS署名バージョン4を使用してAWS認証情報でリクエストに署名する必要があります。

:AWSコンソールにサインインしても、APIへのブラウザーのリクエストに自動的に署名されるわけではありません。


3

間違ったAPIを呼び出しているときにこのメッセージが表示されることがあります

APIエンドポイントを確認してください


2

上記の回答のすべての手順を実行し、問題を解決できない場合は、上記のすべてを試してみます。

  1. 左側のメニューで、[リソース]をクリックします
  2. 「リソース」の右側で、「POST / GETなど)のように、テストするapiメソッドを押します。
  3. 「ACTION」リストをヒットします(ステップ2のAPIメソッドの上にあります)
  4. 「DEPLOYAPI」を選択します(すでにAPIをデプロイしている場合でも実行してください)
  5. 「デプロイメント段階」で、「prod」または以前のデプロイで書き込んだものを選択します(以前のデプロイを上書きします)
  6. デプロイをヒット

そのため、「METHOD REQUEST」(ステップ2のこのメニューへの移動方法を参照)を作成するときに、「Authorization」でapiのテスト後に「AWS_IAM」を選択し、awsテストオプションで「postman」で試してみます。 「その後、「METHOD REQUEST」の「Authorization」で「none」を選択する必要があることを理解しました

私はそれをnoneに変更しますが、私が説明するように、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


1

私の場合、それはかなり愚かなことでした。POSTを使用して新しいエンティティが作成され、「認証トークンがありません」で失敗することに慣れました。なんらかの理由で、正常に動作しているPUTとして定義されていることを見逃しました。


0

まず、lamda関数で作成したAPIがAWSプロジェクトに登録されているかどうかを確認します。そのためには、AWSコンソールのAPIゲートウェイに移動します。登録されていない場合は登録してください。これがこの問題の主な原因です。

aws.export.jsファイルで、APIに対応するパスがあることも確認できます['/items']

APIがそこに存在する必要があります。存在しない場合、APIはリクエストにセキュリティトークンを追加しません。これを行うには、コンソールのプロジェクトクラウドロジックに登録するだけです。

そこにある場合は、上記のソリューションhttp://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-use-postman-to-call-api.htmlを使用し
ます


0

記録として、資格情報を使用しない場合、このエラーは、POST / PUTメソッドのリクエストバリデーターを「本体、クエリ文字列パラメーターとヘッダーを検証する」、または他のオプション「クエリ文字列を検証する」に設定している場合にも表示されますパラメータとヘッダー "....その場合、ヘッダーの資格情報を検索し、リクエストを拒否します。要約すると、資格情報を送信するつもりがなく、開いたままにしておきたい場合は、リクエストバリデーターでそのオプションを設定しないでください(NONEまたは本体の検証のいずれかに設定してください)


0

貢献する:

戻り応答に次のような「body」が含まれていなかったため、同様のエラーが発生しました。

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

まだ問題を抱えている人にとっては、これに気付いた後は本当に馬鹿げていると思い/itemsますが、APIを追加するときにデフォルトのURLを渡しました。しかし、私はでエンドポイントを呼び出し続けました/apiCarlos Alberto Schneiderあなたの投稿を読んだ後、私の問題に気づいたので、特に感謝します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.