Cloudflare Pages FunctionsのBasic認証から本番環境を除外する

Cloudflare Pages FunctionsのBasic認証から本番環境を除外する

以前、「Cloudflare Pagesに Basic認証をかける」というエントリーを書きましたがその続きです。

紹介した方法ではプレビュー用のブランチなど含めてすべての環境でBasic認証がかかってしまいます。

開発中は良いのですが本番公開後は、本番環境にはBasic認証をかけずに、それ以外の環境でBasic認証をかけたいというケースが多いと思います。

Cloudflare Pagesではプロダクション環境とプレビュー環境で環境変数を変えることができますのでプレビューのみ除外することもできます。

しかし、Cloudflare Pagesではカスタムドメイン等を利用している場合はプロダクション環境でも、www.to-r.net といった本番ドメイン以外に、デフォルトで割り当てられる {プロジェクト名}.pages.dev といった pages.dev のサブドメインも割り当てられてしまいます。

Cloudflareのプレビュードメイン
Cloudflareではプロダクション環境で指定したブランチに対して{プロジェクト名}.pages.devというドメインを割り当てる他に、ブランチごとに{ブランチ名}.{プロジェクト名}.pages.devやプッシュ毎に{ハッシュ値}.{プロジェクト名}.pages.devといった複数のドメインが割り当てられます。
プレビュードメインは設定でOFFにすることもできます。

本番ドメイン以外にBasic認証

これらの問題を解決するのには本番ドメイン以外にBasic認証をかけてしまうのが手っ取り早いです。

Cloudflare Pages Functionsでは request.url でリクエストがあったURL情報が取得できますので、以前紹介したBasic認証をの冒頭で本番ドメイン以外にBasic認証がかかるように適用すれば可能です。

async function handleRequest({ next, request }) {
  const url = new URL(request.url);

  // 本番ドメインではベーシック認証をかけない
  if (url.origin === "https://www.to-r.net") {
    return await next();
  }

  // これ以降は以前紹介したコードのまま

}

Node.jsでBasic認証をハンドリングをする機会はCDN Edge以外では少ないと思いますので必要な人は参考にしてください。

Cloudflare Zero Trustによるアクセス制限
Cloudflareでは今回紹介したBasic認証以外にCloudflare Zero Trustというサービスによるアクセス制限を用意しています。
管理画面でアクセスできるユーザーが制御できるので高度なアクセス管理が可能ですが、関係者が複数になると管理が煩雑になるデメリットも存在します。自由度とセキュリティはある意味トレードオフになるので用途にあった認証方法を指定してください。