ayumu_aoの日記

SIerから事業会社に転職したエンジニアが技術についてや組織論、本の話、今までの体験談などなどを個人的に垂れ流しています。

CloudFront+S3+Lambda@Edgeを使ったときにBasic認証してみる

CloudFront+S3+Lambda@Edgeを使ったときにBasic認証してみる

最近要望が多かったのでサーバレス構成でBasic認証してみたのでその時のソースをメモメモ。。

下のソースをLambdaに書いてビューアーリクエストトリガに設定しておけばできましたので!

'use strict';

exports.handler = (event, context, callback) => {
    const request = event.Records[0].cf.request;
    const headers = request.headers;
    
    // XXX 環境変数にするとエラーが発生するため直接記載(@Edgeの機能を利用しているためだと思われる)
    const authUser = 'ユーザー名を設定';
    const authPass = 'パスワードを設定';

    // Construct the Basic Auth string
    const authString = 'Basic ' + new Buffer(authUser + ':' + authPass).toString('base64');

    // 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);
    }
    // basic認証した後にやりたい処理を記載。
    // 処理終了
    callback(null, request);
}