🔥
【Firebase Authentication】ユーザーアカウント作成のツールをサクッと用意する
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