【firebase】functions x hosting 環境でBasic認証をかけている時のBasic認証の挙動確認
firebase functions と firebase hosting を併用しているプロジェクトで Basic認証をかけている時の Basic認証の対象の挙動が分からなかったので確認しました。
firebase で Basic認証をかける
firebase で Basic 認証をかけるためには functions を使用する必要があります。
このようなフォルダ構成の時、
- functions // functionsにアップロードされる対象 - index.js - static - index.html - public // hostingにアップロードされる対象 - sample.png - firebase.json
以下のようなfunctionsでBasic認証をかけることができます。
import * as functions from "firebase-functions"; import express from "express"; import path from "path"; const basicAuth = require("basic-auth-connect"); //--------------------------------------------------------------------------------------------- // constants //--------------------------------------------------------------------------------------------- const USE_BASIC_AUTH = true; const AUTH_USER = "user"; const AUTH_PASSWORD = "pass"; //--------------------------------------------------------------------------------------------- // main //--------------------------------------------------------------------------------------------- const server = express(); // basic認証 if (USE_BASIC_AUTH) { server.use(basicAuth(AUTH_USER, AUTH_PASSWORD)); } server.use(express.static(path.join(`${__dirname}/static/`))); export const hostingApp = functions.https.onRequest(server);
firebase.jsonはこのようになります。
{ "functions": { "source": "./functions" }, "hosting": { "public": "./public", "rewrites": [ { "source": "**", "function": "hostingApp" } ], ... } }
hosting にアップされたファイルにはBasic認証がかからない
hosting の rewrite ルールの優先度はドキュメントにこのように書いてあります。
https://firebase.google.com/docs/hosting/functions?hl=ja#use_a_web_framework
注: public ディレクトリ内の静的ファイルは rewrite よりも優先されるため、静的ファイルは Cloud Functions エンドポイントと一緒に提供されます。
つまり、hosting は functions でかけているBasic認証の対象にならないので、先ほどのフォルダ構成とBasic認証がかかるかかからないかの関係性はこのようになります。
- functions // functionsにアップロードされる対象 - index.js - static - index.html <- Basic認証がかかる - public // hostingの対象 - sample.png <- Basic認証がかからない
逆にいうと、基本的にはBasic認証をかけたいが、とあるファイルだけBasic認証の対象から外したい、という場合には rewrite のルールを書かずに hostingにアップロードするのが良いのかもしれません。