💭

Cloudflare Accessで同一ドメインでパス別に認証方法を変えて挙動をみる

2024/10/07に公開

Cloudflare Accessでの認証はケースバイケースですが、とても手軽でいいですよね!
社内に簡単なアプリケーションを公開する際、開発環境を社内公開する際などに便利に使われることが多いのかなと思います。

今回は、例えば /admin/* だけGoogle Workspace認証にして、 それ以外はPIN認証またはGoogle認証にする、といったパス別で認証方式を変えることができるのか気になったのでサッと確かめてみました。

下準備

非常にテキトウな検証用アプリケーションをCloudflare Pagesにデプロイしておきます。

以下のファイルを作成し、GitHubリポジトリにアップロードします。
その後Cloudflare Pages側からGitHub連携設定をすることで、すぐアクセス可能になるかと思います。簡単ですね。

index.html

<!DOCTYPE html>
<html>
<head>
  <title>Hello World</title>
</head>
<body>
  <h1>Hello World</h1>
</body>
</html>

functions/hello.ts

export async function onRequest() {
  return new Response("Hello", {
    headers: { "Content-Type": "text/plain" },
  });
}

functions/admin/world.ts

export async function onRequest() {
  return new Response("World", {
    headers: { "Content-Type": "text/plain" },
  });
}

作られるのは以下。

  • /
    • Hello Worldと書かれたHTMLが返る
  • /hello
    • Helloというテキストが返る
  • /admin/world
    • Worldというテキストが返る

Cloudflare Accessの設定

それではAccessの設定をしていきましょう。
今回の検証では、「/admin/*」をGoogle認証、「/*」をPIN認証にしてみて、どのような挙動になるか見てみましょう。

パスごとにAccessの認証設定を変えるには、Accessで作成するApplicationを複数作る以外方法はなさそうです。 ※ 他に良い方法あればご指摘ください。

作成したApplication
設定したAuthentication(1)

設定してみましたが、どうやら認証の優先順位を変えるといった機能はないようです。
同一のドメイン、パスのApplicationは制約で登録できないので、パスのマッチ度が高いものが優先されるのでしょうか?

検証

いくつかのパターンでどのような挙動になるか見てみましょう。

  1. /admin/*」にアクセス
  2. /*」で認証を通したあと、「/admin/*」にアクセス
  3. /admin/*」で認証を通したあと、「/*」にアクセス

1. 「/admin/*」にアクセス

/admin/*」にアクセスしてみましょう。
/*」と「/admin/*」両方にマッチしますが、2回認証が挟まるようなことはあるのでしょうか?
期待としてはより具体的な 「admin/*」のGoogle認証が表示されてほしいところです。

/adminへのアクセス結果

期待通りGoogle認証になりました!

おそらく複数のApplicationにマッチする場合の優先順位は、一番長くマッチするApplicationが選ばれるようです。

Google認証後、問題なくレスポンスが返ってきたので、複数Applicationマッチした場合は一つでも認証が通ればOKという挙動になっていそうです。
/admin認証後結果

2. 「/*」で認証を通したあと、「/admin/*」にアクセス

/*」で認証を通したあと、「/admin/*」にアクセスするとどうなるでしょうか?
期待する挙動としては、再度認証画面(/admin/*に設定したGoogle認証)が表示されてほしいです。

まず / でPIN認証。
/アクセス時結果

続いて /admin/hello にアクセス。
/admin/helloアクセス結果

再度認証画面が表示されました。
期待した通り、より具体的なパスのApplicationにマッチした場合は、再度そちらのApplicationの認証が表示されるようです。

3. 「/admin/*」で認証を通したあと、「/*」にアクセス

では逆に「/admin/*」で認証を通したあと、「/*」つまり「/hello」にアクセスするとどうでしょうか?

/helloアクセス時結果

再度認証画面が表示されました。
今回だと、 /hello はPIN認証を通すApplicationしかマッチせず、そちらの認証が通っていないため、通す必要があるという状態のようですね。

まとめ

やりたかったCloudflare Accessで同一ドメインでパス別に認証方法を変えてみることはできましたね!
しっかりと挙動を捉えて効果的に使っていきたいですね。

3行まとめ

  • Cloudflare Accessは同一ドメインでもパスが違えば複数Application登録可能
  • 複数Applicationのパスに引っかかる場合、より具体的なパスのApplicationが優先され、一回だけ認証が入る
  • 認証済みでも、別ページアクセス時に別Applicationのパスに引っかかっている場合、再度認証が入る
SMARTCAMP Engineer Blog

Discussion