BASIC認証する時はAPI Gateway v2 (HTTP API)を使おう
API Gatewayを介してLambdaをAPIとして公開する際に、BASIC認証の実装で躓いた所があったので備忘録として残します。
BASIC認証のダイアログが表示される仕組み
BASIC認証は、HTTPの仕様の一つで、クライアントがサーバーに対して認証情報を送信する仕組みです。
サーバーは、クライアントから送信された認証情報を検証し、認証に成功した場合はリソースを返します。
認証に失敗した場合は、401 Unauthorized
を返し、WWW-Authenticate
ヘッダーに要求する認証を記述します。
クライアントは、このWWW-Authenticate
ヘッダーを受け取る事で、ユーザーに対して認証ダイアログを表示します。
認証ダイアログ
API Gatewayの罠
API Gateway v1では、セキュリティ上の理由から特定のヘッダーが上書きされる仕組みがあります。
下記の表にある通り、WWW-Authenticate
はRemapped
の対象となっており、LambdaからWWW-Authenticate
を返すと、x-amzn-remapped-www-authenticate
へと書き換えられてしまいます。
その為、LambdaからWWW-Authenticate
を返しても、クライアントに対して認証ダイアログが表示される事はありません。
また、この動作はFunction URLを利用した場合でも同様です。
おそらくFunction URLのバックエンドにはAPI Gateway v1が利用されているのでしょう。(あくまで憶測ですが。。。)
解決策
この問題はAPI Gateway v2を利用する事で解決する事が出来ます。
API Gateway v2ではv1にあるような制限がありません。
下記のドキュメントにあるAmazon API Gateway の REST API に関する重要な注意点
とは、API Gateway v1の事を指しており、API Gateway v2にはこの制限はありません。
ドキュメント上で使われているREST API
とは、API Gateway v1の事を指しており、API Gateway v2はHTTP API
と呼ばれています。
(分かりにくすぎるだろ!!!!!!!!!!!!!!!!!)
上記のことから、API Gateway v2ではv1にあるような制限がない為、通常通りLambdaからWWW-Authenticate
を返す事で、クライアントに対して認証ダイアログが表示されます。
まとめ
僕はこの問題に躓いて、1日潰しました。
同じような問題に躓いている人が、この記事を見て解決出来る事を願っています。
Discussion