web-dev-qa-db-ja.com

API Gatewayカスタム認証からの401戻り値に「Access-Control-Allow-Origin」ヘッダーがありません

ログインしていないユーザーがAWS API Gatewayを介して私のラムダ関数を呼び出すのを防ぐために、カスタムオーソライザーのラムダソリューションを使用しています。

要求が承認され(200)、呼び出されたラムダから応答が得られた場合、すべて正常に機能し、Access-Control-Allow-Originヘッダーが得られます。

しかし、リクエストが承認されていない場合、Access-Control-Allow-Originヘッダーのない401を取得するため、応答の401ステータスを読み取ってユーザーをログインページにリダイレクトできません。

これは、カスタム自動化メカニズムがリクエストでCORSを使用する必要があることを認識していないためだと思います。これが実際に問題であることを誰もが知っていますか?可能な解決策を知っていますか?

41
hanbzu

統合を呼び出さない要求のエラー応答をカスタマイズできる新しいゲートウェイ応答機能を発表できてうれしいです。これにより、認証リクエストが失敗した場合でも、CORSヘッダーが含まれていることを確認できます。

詳細については、CORSの例を含む ドキュメント をご覧ください。

17
Bob Kinney

はい、これはAPI Gatewayカスタム認証の既知のバグです。これをご報告いただきありがとうございます。チームは、修正プログラムを展開したときにこの投稿を更新します。ご迷惑をおかけして申し訳ございません。

13
Lorenzo de Lara

すべての4XXエラー(401エラーを含む)でこれを解決する最も簡単な方法は、「ゲートウェイ応答」に進み、「デフォルト4XX」を選択し、ヘッダー「Access-Control-Allow-Origin」に値「*」を追加することです。 '。

スクリーンショットを見る: 

7
Alex Robinson

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"
4
pisomojado

上記の回答に加えて、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])
0
amsh