sundev

Lambda AuthorizerのCORS対応

2023/06/03

API Gateway

CORS

article

概要

PostリクエストでLambda Authorizerによってリクエストが弾かれた時(Denyポリシーが返された時)、CORSエラーとなった。

原因

Lambda Authorizerでエラーがスローされるか、「拒否」ポリシーが返される場合、接続されているLambda関数は呼ばれない。
その場合にオーソライザーハンドラーには、戻りオブジェクトで使用するヘッダーを設定できない。
解決策として、GatewayResponsesに AWS 応答に対して応答のカスタマイズを指定する。

実装

CDK

lib/construct/api.ts
          export class Api extends Construct {
  constructor(scope: Construct, id: string, props: ApiProps) {
    super(scope, id);

    const api = new apigateway.RestApi(this, "api", {
      defaultCorsPreflightOptions: {
        allowOrigins: apigateway.Cors.ALL_ORIGINS,
        allowMethods: apigateway.Cors.ALL_METHODS,
        allowHeaders: apigateway.Cors.DEFAULT_HEADERS,
        statusCode: 200,
      },
    })

    api.addGatewayResponse('unauthorized-response', {
      type: apigateway.ResponseType.UNAUTHORIZED,
      statusCode: '401',
      responseHeaders: {
        'Access-Control-Allow-Origin' : "'*'",
        'Access-Control-Allow-Headers': "'*'"
      },
    });

    api.addGatewayResponse('access-denied-response', {
      type: apigateway.ResponseType.ACCESS_DENIED,
      statusCode: '403',
      responseHeaders: {
        'Access-Control-Allow-Origin' : "'*'",
        'Access-Control-Allow-Headers': "'*'"
      },
    });

  }
}
        

参考

https://stackoverflow.com/questions/36913196/401-return-from-an-api-gateway-custom-authorizer-is-missing-access-control-allo/44403490#44403490

RECOMMENDED

© 2023 sundev All Rights Reserved.