ログインしていないユーザーがAWS API Gatewayを介して私のラムダ関数を呼び出すのを防ぐために、カスタムオーソライザーのラムダソリューションを使用しています。
要求が承認され(200)、呼び出されたラムダから応答が得られた場合、すべて正常に機能し、Access-Control-Allow-Origin
ヘッダーが得られます。
しかし、リクエストが承認されていない場合、Access-Control-Allow-Origin
ヘッダーのない401を取得するため、応答の401ステータスを読み取ってユーザーをログインページにリダイレクトできません。
これは、カスタム自動化メカニズムがリクエストでCORSを使用する必要があることを認識していないためだと思います。これが実際に問題であることを誰もが知っていますか?可能な解決策を知っていますか?
統合を呼び出さない要求のエラー応答をカスタマイズできる新しいゲートウェイ応答機能を発表できてうれしいです。これにより、認証リクエストが失敗した場合でも、CORSヘッダーが含まれていることを確認できます。
詳細については、CORSの例を含む ドキュメント をご覧ください。
はい、これはAPI Gatewayカスタム認証の既知のバグです。これをご報告いただきありがとうございます。チームは、修正プログラムを展開したときにこの投稿を更新します。ご迷惑をおかけして申し訳ございません。
すべての4XXエラー(401エラーを含む)でこれを解決する最も簡単な方法は、「ゲートウェイ応答」に進み、「デフォルト4XX」を選択し、ヘッダー「Access-Control-Allow-Origin」に値「*」を追加することです。 '。
スクリーンショットを見る:
Cloud Formationですべてをまとめる方法を理解するのに時間がかかったので、ここに設定方法を示すスニペットがあります。
...
MyApi:
Type: "AWS::ApiGateway::MyApi"
Properties:
Description: My API
Name: "my-api"
MyApiAuthorizer:
Type: "AWS::ApiGateway::Authorizer"
Properties:
Name: "my-api-authorizer"
IdentitySource: "method.request.header.Authorization"
ProviderARNs:
- !GetAtt MyUserPool.Arn
RestApiId: !Ref MyAApi
Type: COGNITO_USER_POOLS
MyApiGatewayResponse:
Type: "AWS::ApiGateway::GatewayResponse"
Properties:
ResponseParameters:
"gatewayresponse.header.Access-Control-Allow-Origin": "'*'"
"gatewayresponse.header.Access-Control-Allow-Headers": "'*'"
ResponseType: UNAUTHORIZED
RestApiId: !Ref MyApi
StatusCode: "401"
上記の回答に加えて、Cloudformation/SAMテンプレートを使用していない場合は、このpythonスクリプトを使用して手動の手順をいくつか保存できます。
import boto3
import sys
if len(sys.argv) != 3:
print("usage: python script.py <API_ID> <STAGE>")
exit()
client = boto3.client('apigateway')
response = client.put_gateway_response(
restApiId=sys.argv[1],
responseType='UNAUTHORIZED',
statusCode='401',
responseParameters={
"gatewayresponse.header.Access-Control-Allow-Origin": "'*'",
"gatewayresponse.header.Access-Control-Allow-Headers": "'*'"
}
)
response = client.create_deployment(
restApiId=sys.argv[1],
stageName=sys.argv[2])