takumifukasawa’s blog

WebGL, Shader, Unity, UE4

【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にアップロードするのが良いのかもしれません。