🔐
SPAをデプロイしたCloudflare WorkersにBasic認証を設定する
Cloudflare Pagesがdeprecated(?)になるようで
お試しに、書いている最中のフロントエンド(React SPA)をCloudflare Workersにデプロイし直した。
ただBasic認証をかける方法が見つからず... Pagesであればfunctions/_middleware.js
で済んだのだが...
探してもあまり見つからなかったので、メモ。
worker.js
を作成していつもの「アレ」を書いて、wrangler.jsonc
に色々と書く。この「色々と書く」部分でちょっと詰まった。
手順
src/worker.js
を作成
1. いつもの「アレ」。こういう、よく調べるけどイチから書くのがめんどいコードを秒で出してくれるので、LLMsには頭が上がらない。
env.~
で、Cloudflare Workersのシークレットを参照できる。
export default {
async fetch(request, env, ctx) {
const username = env.BASIC_AUTH_USERNAME
const password = env.BASIC_AUTH_PASSWORD
const authString = `${username}:${password}`
const expectedAuth = `Basic ${btoa(authString)}`
const authHeader = request.headers.get('Authorization')
if (!authHeader || authHeader !== expectedAuth) {
return new Response('401 Unauthorized', {
status: 401,
headers: {
'WWW-Authenticate': 'Basic realm="Secure Area"',
'Content-Type': 'text/plain'
}
})
}
return env.ASSETS.fetch(request)
}
}
wrangler.jsonc
を作成
2. これが正しいかは分からない。ただ、「動いた」。
ハマりどころとしては、"run_worker_first": true,
を書くだけではWARNINGが表示される。"binding": "ASSETS",
も書いてあげる必要がある。
{
"$schema": "node_modules/wrangler/config-schema.json",
"name": "app",
"compatibility_date": "2025-05-07",
"main": "src/worker.js",
"assets": {
"directory": "./dist/",
"binding": "ASSETS",
"run_worker_first": true,
},
}
あとは普通にWorkersにデプロイすると、Basic認証の入力が表示されるはずです。
誤りありましたらご教示いただけますと幸いです。
Discussion