はじめに

Firebase Authenticationなどを使ってログイン処理を用意している場合、ブロッキング関数を使うことで簡易的にIP許可制限が実現ができます。

ブロッキング関数とは

簡単にいうとFirebaseを使ったログインやアプリの登録時などの認証時に、特定の条件を設定することができる関数になります。条件を設定することでアクセス制限やドメインのブロックなどが可能となります。ブロッキング関数に関する詳細はFirabaseのドキュメントに記載があります。

設定項目

ブロッキング関数は、次のイベントのタイミングで登録ができます。今回はログインを制御するため、ログイン前(beforeSignIn)を設定していきます。

  • アカウント作成前(beforeCreate):ユーザーが作成される前に、ユーザーが最初にアプリに登録した時点で実行される関数。
  • ログイン前(beforeSignIn):認証が完了するまで、ユーザーがアプリへのログインを試行するたびに実行される関数。

Functionの作成

ソース作成するプロジェクトやディレクトリ配下で下記のコマンドを実行します

firebase init functions

プロジェクト名や使用する言語についての質問が出てきますので答えていきます。質問後、functionsフォルダ配下に必要なファイル群が作成されます。今回はJavaScriptを指定しましたので、関数の処理を書くのはindex.jsとなります。

続いてbeforesignedinの処理を書いていきます。ソースの例やプロパティなどの情報はドキュメント(Authトリガーのブロック)に記載があります。

[index.js]
const {beforeUserSignedIn} = require("firebase-functions/v2/identity");
const {HttpsError} = require("firebase-functions/v2/identity");
const logger = require("firebase-functions/logger");

exports.beforesignedin = beforeUserSignedIn((event) => {
  logger.info("beforeUserSignedIn : ", event.ipAddress);
  // 条件に合わない場合はErrorを返し、条件に合う場合はそのまま認証処理通過となる
  if (!isSuspiciousIpAddress(event.ipAddress)) {
    throw new HttpsError('permission-denied', 'Unauthorized access!');
  }
});

// IPアドレスチェック
function isSuspiciousIpAddress(ip) {
  const allowList = [
    'xxx.xxx.xxx.xxx', // 許可IPアドレス
  ];
  if (allowList.includes(ip)) {
    return true;
  }
  return false;
}

Firebaseへのデプロイ

実装したソースを下記コマンドでFirabase側にデプロイします。

firebase deploy --only functions

作成したブロッキング関数を設定

デプロイが成功したら、Firebaseコンソール画面でブロッキング関数を設定します。Authentication画面の設定タブを開くと、設定項目が並びますのでブロッキング関数を開きます。

ログイン前(beforeSignIn)にタブで設定ができるようになっていますので、デプロイが正常に行われている場合は、作成した関数”beforesignedin”が選択できる状態になっていますので設定します。保存ボタンを保存することで完了となります。

動作確認

実際に、許可したIP以外からアクセスしてログインを試すと認証エラーとなることが確認できます。導入もスムーズに進み、簡易的にIP制御を用意したい場合は便利な方法かと思います。