⚙️
SAMのAPIGatewayのAuth設定には AddDefaultAuthorizerToCorsPreflightというのがある
もう見たまんまの設定なんだけどそういうのがある。
前提知識
- preflight request
- cors
- 単純リクエスト
- AWS SAMによるバックエンド構築
この設定で何ができるの?
SAMで作ったAPIGatewayのリソースで、OPTIONSメソッドによる定義の部分の認証をなし(none)にできる
どういう時に使うの?
Webアプリ等でバックエンドにAPIGateway+Lambdaを設置するうえで、以下の条件を使う場合
- APIGatewayにCORS設定を有効にしている(当然Webアプリ等で使うなら必須である)
- APIGatewayに認証処理をつける
- CognitoでもAPIキーでもどちらでも
- APIへのリクエストが単純リクエスト ではない
ちょっと詳細
なんでこういう設定が必要なのか(あるいは設定がなければどうなるのか)。
- WebアプリからAPIGatewayにリクエストを送ろうとする
- 先にプリフライトリクエストが送られる
- プリフライトリクエストはヘッダーに認証が付けられないため、APIGatewayは認証エラーを返す
- プリフライトリクエストがエラーになるためリクエストが送信されずエラーになる
これを回避するために上記の設定をつける。するとこうなる
- WebアプリからAPIGatewayにリクエストを送ろうとする
- 先にプリフライトリクエストが送られる
- プリフライトリクエスト(OPTIONSリクエスト)は認証なしでレスポンスを返すため、CORS設定とAPIが有効であれば204(APIGatewayは200でBodyに空のJSONが入っている)を返す
- プリフライトリクエストが成功し、本来のリクエストが送信される
- 本来のリクエストはもちろんちゃんと認証がされる
ちなみに認証のヘッダーがついた時点でリクエストは単純リクエストではなくなる(ついでにBodyがJSONだったりしたらそれも単純リクエストではなくなる)ため、多くの場合単純リクエストではないリクエストを送ることになっているはず
なんで書いたの
設定がもうまさにそのまんまで見つけたときめちゃくちゃ笑ったから。
あとCORSの問題なのか、リクエストの仕方の問題なのか、はたまたAPIGatewayの問題なのかわかりにくいのでその手助けになればいいなぁと思った(実際これはAPIGatewayの設定の問題でもある)。
参考資料
Discussion