🙃

Firebase Authentication Admin SDKによるパスワード強制変更

に公開

問題の概要

「とりあえずアカウントを作成したい」という理由で、存在しないメールアドレスでユーザーを作成した場合、パスワードを忘れた際にFirebaseコンソールの「パスワードをリセット」機能を使おうとすると、メール送信に依存するためリセットメールが届かず、パスワード変更が不可能になってしまいました。

アカウントを作成し直すという方法もありますが、既に作成したデータがある場合や、そのユーザーに紐づいた情報がある場合は現実的ではないと考えます。

本記事では、Firebase Admin SDKを使用して強制的にパスワードを変更する方法を解説します。

解決方法

1. サービスアカウント認証情報の取得

Firebase Admin SDKを使用するには、サービスアカウントの認証情報が必要になります。

  1. Firebaseコンソール > プロジェクト設定 > サービスアカウント
  2. 「新しい秘密鍵の生成」をクリック
  3. JSONファイルがダウンロードされる(例:your-project-firebase-adminsdk-xxxxx.json

2. プロジェクトIDの確認

  1. Firebaseコンソール > プロジェクト設定 > 全般タブ
  2. 「プロジェクトID」をコピー

3. ユーザーUIDの確認

  1. Firebaseコンソール > Authentication > Users
  2. 対象ユーザーの「ユーザーUID」をコピー

4. 必要なパッケージをインストール

npm install firebase-admin

5. 実装

reset-password.js
const admin = require('firebase-admin');

// ダウンロードしたサービスアカウント認証情報を読み込み
const serviceAccount = require('./your-project-firebase-adminsdk-xxxxx.json');

// Firebase Admin SDK初期化
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  projectId: "your-project-id" // 実際のプロジェクトIDに置き換え
});

// パスワード変更の実行
const uid = 'your-user-uid';  // 実際のユーザーUIDに置き換え
const newPassword = 'NewSecurePassword123'; // 新しいパスワード

admin.auth().updateUser(uid, {
  password: newPassword
}).then((userRecord) => {
  console.log('✅ パスワード変更完了');
  console.log('ユーザーUID:', userRecord.uid);
  console.log('新しいパスワード:', newPassword);
  process.exit(0);
}).catch((error) => {
  console.error('❌ エラー発生:', error.message);
  process.exit(1);
});

6. 実行

node reset-password.js

成功すると以下のような出力が表示されます。

✅ パスワード変更完了
ユーザーUID: AbCdEfGhIjKlMnOpQrSt
新しいパスワード: NewSecurePassword123

これで、新しいパスワードを使ってFirebase Authenticationにログインできるようになります。

その他のAdmin SDK活用例

パスワード変更以外にも、Admin SDKでは様々なユーザー管理操作が可能です。

メールアドレスの変更

admin.auth().updateUser(uid, {
  email: 'new-email@example.com',
  emailVerified: true
});

ユーザーの無効化・有効化

// 無効化
admin.auth().updateUser(uid, { disabled: true });

// 有効化
admin.auth().updateUser(uid, { disabled: false });

複数項目の一括更新

admin.auth().updateUser(uid, {
  email: 'updated@example.com',
  password: 'newPassword123',
  displayName: 'New Display Name',
  emailVerified: true
});

本番環境での推奨実装

ローカル環境では認証情報ファイルを直接読み込んでも問題ありませんが、本番環境等では環境変数を使用することを推奨します。

// 環境変数を使った実装例
admin.initializeApp({
  credential: admin.credential.cert({
    projectId: process.env.FIREBASE_PROJECT_ID,
    privateKey: process.env.FIREBASE_PRIVATE_KEY.replace(/\\n/g, '\n'),
    clientEmail: process.env.FIREBASE_CLIENT_EMAIL,
  })
});

使用後の後処理

  • スクリプト実行後は認証情報ファイルを削除または安全な場所に移動
  • 不要になったサービスアカウントは削除

メール認証機能の実装

そもそもFirebase Authenticationには標準でメール認証機能が備わっています。これを活用すれば、存在しないメールアドレス問題を根本から防げます。

  1. アカウント作成時に認証メールを自動送信
  2. メール認証完了後に初めてログイン可能にする
  3. 存在しないメールアドレスでは認証メールが届かないため、実質的に使用不可能

この流れにしておけば、問題を未然に防げることでしょう。

まとめ

Firebase Admin SDKのupdateUserメソッドを使用することで、Firebaseコンソールでは解決できないパスワード変更問題を解決できます。

なにかの参考になれば幸いです。

株式会社アクトビ

Discussion