2️⃣

BASIC認証する時はAPI Gateway v2 (HTTP API)を使おう

2024/01/11に公開

API Gatewayを介してLambdaをAPIとして公開する際に、BASIC認証の実装で躓いた所があったので備忘録として残します。

BASIC認証のダイアログが表示される仕組み

BASIC認証は、HTTPの仕様の一つで、クライアントがサーバーに対して認証情報を送信する仕組みです。
サーバーは、クライアントから送信された認証情報を検証し、認証に成功した場合はリソースを返します。

認証に失敗した場合は、401 Unauthorizedを返し、WWW-Authenticateヘッダーに要求する認証を記述します。
クライアントは、このWWW-Authenticateヘッダーを受け取る事で、ユーザーに対して認証ダイアログを表示します。


認証ダイアログ

API Gatewayの罠

API Gateway v1では、セキュリティ上の理由から特定のヘッダーが上書きされる仕組みがあります。
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-known-issues.html#api-gateway-known-issues-rest-apis:~:text=Remapped は、ヘッダー名が <string> から X-Amzn-Remapped-<string> に変更されたことを意味します。

下記の表にある通り、WWW-AuthenticateRemappedの対象となっており、LambdaからWWW-Authenticateを返すと、x-amzn-remapped-www-authenticateへと書き換えられてしまいます。
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-known-issues.html#api-gateway-known-issues-rest-apis:~:text=パススルー-,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にはこの制限はありません。
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-known-issues.html#api-gateway-known-issues-rest-apis

ドキュメント上で使われているREST APIとは、API Gateway v1の事を指しており、API Gateway v2はHTTP APIと呼ばれています。
(分かりにくすぎるだろ!!!!!!!!!!!!!!!!!)

上記のことから、API Gateway v2ではv1にあるような制限がない為、通常通りLambdaからWWW-Authenticateを返す事で、クライアントに対して認証ダイアログが表示されます。

まとめ

僕はこの問題に躓いて、1日潰しました。
同じような問題に躓いている人が、この記事を見て解決出来る事を願っています。

PrAha

Discussion