はじめに
今回、AWSのCloudFrontを使用している案件で、検証環境についてのみBasic認証をかけたいという要望があったため対応をしました。
CloudFront環境でBasic認証をかけるにはLambda@Edgeを使用するのがよいそうです。
※Authenticatioヘッダをフォワードするという方法もありますが、キャッシュヒット率が低下するため今回は採用しませんでした。
ググって先人の記事の通りに実施したところ、PCやスマホではうまくいきましたが、ガラケー(フィーチャーフォン)ではうまくいかなかったためコードを少し修正しました。
以外とこの件についてはネット上に情報が少なかったため、メモ書きとして残しておきます。
CloudFrontやLambda@Edgeの詳細については、他の人がいっぱい記事にしているのでここでは省きます。
ここではガラケー対応した部分のみをクローズアップします。
まずやったこと
ググった先人のコードをパクってインスパイアして設定してみました。
※Basic認証部分のみを抜粋
// Require Basic authentication
if (typeof headers.authorization == 'undefined' || headers.authorization[0].value != authString) {
    const body = 'Unauthorized';
    const response = {
        status: '401',
        statusDescription: 'Unauthorized',
        body: body,
        headers: {
            'www-authenticate': [{key: 'WWW-Authenticate', value: 'Basic'}]
        },
    };
    callback(null, response);
}
その結果、PCやスマホでは想定通りBasic認証が発動しました。
がしかし、ガラケーで試してみると、
このページはエラー(401)により表示することができません。
という画面が表示され、Basic認証が発動しませんでした。
ガラケー対応内容
401ステータスコード自体はガラケーで受け取れているようなので、他に過不足なヘッダー情報があるのかな?
と思い色々調べてみたところ、wikiにこのような例が載っていました。
# 認証が必要であることを示すサーバのレスポンス:
HTTP/1.1 401 Authorization Required
Date: Wed, 11 May 2005 07:50:26 GMT
Server: Apache/1.3.33 (Unix)
WWW-Authenticate: Basic realm="SECRET AREA"
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=iso-8859-1
『Basic realm』!!
ApacheでBasic認証の設定をする際も、Basic realmを設定必要がありました。
このBasic realmを設定することが、Basic認証の正しいお作法なのかもしれない…という推測を立てて、上記Lambda@Edgeのコードを少し修正しました。
// Require Basic authentication
if (typeof headers.authorization == 'undefined' || headers.authorization[0].value != authString) {
    const body = 'Unauthorized';
    const response = {
        status: '401',
        statusDescription: 'Unauthorized',
        body: body,
        headers: {
-           'www-authenticate': [{key: 'WWW-Authenticate', value: 'Basic'}]
+           'www-authenticate': [{key: 'WWW-Authenticate', value: 'Basic realm="Basic Area"'}]
        },
    };
    callback(null, response);
}
このコードを適用してガラケーでアクセスしみると、問題なくガラケーでもBasic認証が発動されました。めでたしめでたし
おわりに
このプロジェクトでは、どうしてもガラケー(フィーチャーフォン)を切りたくないらしく、今回のようにガラケーのためだけに必要な対応が他にも多々発生しています。しかもガラケー対応に対するノウハウはなかなかネットにも転がっておらず大変です…
ガラケー対応分として、もっとコストや時間にバッファを積んでおくべきだっと思う今日この頃です