🔥

【Firebase Authentication】ユーザーアカウント作成のツールをサクッと用意する

2022/11/05に公開

Firebase Authenticationで、テスト用のユーザーアカウントを適宜作りたい場合や、特定のメンバーだけで使うサービスなどでアカウント登録は手元でやれれば良い場合、Firebaseのコンソールからメール認証のアカウントを作ることもできますが、UIDはランダムなものしか作れない、Nameなどの情報が入れられないといった不便さがあります。

FirebaseのAdmin SDKをつかえばコードからのSign upができるので、簡易的なツールにしておくと何かと捗ります。

ここではサクッとNode.jsで動かすコンソールアプリをTypeScriptで作る例を載せておきます。

前提

  • Node.js (npm) の使える環境(開発&実行環境)
  • Firebase上のプロジェクト作成までは終わっているものとする
  • 認証はメールアドレス&パスワードのみ

開発の準備

  • npm init してから以下をnpm install
    • typescript
    • ts-node (tsのまま実行できるように)
    • firebase-admin
      • v8.11.0 で検証しました
  • 下記コマンドでtsconfigを作っておく
    • npx tsc --init
  • npm run start で実行できるように、package.jsonに以下を追加しておく
  "scripts": {
    "start": "ts-node index.ts"
  }

index.ts ファイルを作成して、以下のような適当な中身で npm run start で実行されることを確認しておく。

console.log("hoge");

Firebase Admin SDKの秘密鍵を取得

Firebaseのコンソールから プロジェクトの設定>サービスアカウント で秘密鍵の生成を行います。
このあたりは画面のUIが変わることもあるので、構成は参考までに。

ダウンロードしたjsonファイルをプロジェクトフォルダ内に配置。

実装

index.tsファイルの中身はこれだけ。

import * as admin from 'firebase-admin';
import { CreateRequest } from 'firebase-admin/lib/auth/auth-config';

// ★秘密鍵ファイルの場所をここに定義する
const SDK_FILE_PATH = "./YOUR-SDK-FILE-NAME.json";

// ★登録するユーザー情報をここに定義する
const users: CreateRequest[] = [
    { uid:"aaaaa1", email:"aaaaa1@example.com", displayName: "あああああ", password: "aaaaapass", emailVerified: true },
    { uid:"aaaaa2", email:"aaaaa2@example.com", displayName: "あああああ", password: "aaaaapass", emailVerified: true },
    { uid:"aaaaa3", email:"aaaaa3@example.com", displayName: "あああああ", password: "aaaaapass", emailVerified: true },
];

const serviceAccount = require(SDK_FILE_PATH);

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount)
});

for (const user of users) {
    admin.auth().createUser(user).catch(e => {
        console.error(e);
    }).then(res => {
        console.log("done", res);
    });  
}

★の2か所を書き替えて npm run start で実行するだけです。

ユーザー情報の emailVerified は、Eメールの認証が済んでいるかどうかのフラグですね。

エラーになる場合

もしかすると以下のような could not load the shared library エラーが出ることがあるかもしれません。

Error: error:25078067:DSO support routines:win32_load:could not load the shared library
    at Sign.sign (internal/crypto/sig.js:110:29)
    at Object.sign (C:XXX\node_modules\jsonwebtoken\node_modules\jwa\index.js:152:45)
    at Object.jwsSign [as sign] (C:\XXX\node_modules\jsonwebtoken\node_modules\jws\lib\sign-stream.js:32:24)
    at Object.module.exports [as sign] (C:\XXX\node_modules\jsonwebtoken\sign.js:204:16)
    at ServiceAccountCredential.createAuthJwt_ (C:\XXX\node_modules\firebase-admin\lib\app\credential-internal.js:105:20)
    at ServiceAccountCredential.getAccessToken (C:\XXX\node_modules\firebase-admin\lib\app\credential-internal.js:77:28)
    at FirebaseAppInternals.refreshToken (C:\XXX\node_modules\firebase-admin\lib\app\firebase-app.js:45:49)
    at FirebaseAppInternals.getToken (C:\XXX\node_modules\firebase-admin\lib\app\firebase-app.js:37:25)
    at AuthHttpClient.getToken (C:\XXX\node_modules\firebase-admin\lib\utils\api-request.js:612:34)
    at AuthHttpClient.getToken (C:\XXX\node_modules\firebase-admin\lib\auth\auth-api-request.js:188:22) {
  opensslErrorStack: [
    'error:0E076071:configuration file routines:module_run:unknown module name',
    'error:0E07506E:configuration file routines:module_load_dso:error loading dso',
    'error:25070067:DSO support routines:DSO_load:could not load the shared library'
  ],
  library: 'DSO support routines',
  function: 'win32_load',
  reason: 'could not load the shared library',
  code: 'ERR_OSSL_DSO_COULD_NOT_LOAD_THE_SHARED_LIBRARY'
}

自分の端末のOpenSSL設定の問題のようです。
Node.jsのバージョンを最新化することで解決するかもしれません。

Discussion