ユーザーをインポートする

Firebase Admin SDK には、管理者権限でユーザーを Firebase Authentication に一括インポートするための auth.importUsers() API が用意されています。この機能は Firebase CLI でも使用できますが、Admin SDK を使用すると、中間の CSV ファイルまたは JSON ファイルを作成することなく、プログラムによって外部の認証システムまたは他の Firebase プロジェクトから既存のユーザーをアップロードできます。

ユーザー インポート API には次のような利点があります。

  • 異なるパスワード ハッシング アルゴリズムを使用して外部の認証システムからユーザーを移行する機能。
  • 別の Firebase プロジェクトからユーザーを移行する機能。
  • 迅速かつ効率的な一括インポート オペレーションを目的とした最適化。このオペレーションでは、uidemailphoneNumber などの識別子の重複をチェックせずにユーザーを処理します。
  • 既存の OAuth ユーザー(Google、Facebook など)を移行する、または新しい OAuth ユーザーを作成する機能。
  • カスタム クレームを使用するユーザーを一括で直接インポートする機能。

使用方法

1 回の API 呼び出しで最大 1,000 人のユーザーをインポートできます。このオペレーションは高速処理を目的として最適化されていて、uidemailphoneNumber などの一意の識別子の重複はチェックされないことに注意してください。したがって、この API を使用する場合は、一意のフィールドが重複しないようにする必要があります。

// Up to 1000 users can be imported at once.
var userImportRecords = [
  {
    uid: 'uid1',
    email: 'user1@example.com',
    passwordHash: Buffer.from('passwordHash1'),
    passwordSalt: Buffer.from('salt1')
  },
  {
    uid: 'uid2',
    email: 'user2@example.com',
    passwordHash: Buffer.from('passwordHash2'),
    passwordSalt: Buffer.from('salt2')
  },
  ...
];

この例では、ユーザーが次に Firebase Authentication を使用してログインするときに Firebase でユーザーを安全に認証きるように、ハッシュ オプションが指定されています。ログインが成功すると、Firebase では Firebase 内部のハッシング アルゴリズムを使用して、ユーザーのパスワードを再ハッシュします。以下の、アルゴリズムごとの必須フィールドの詳細を確認してください。

Firebase Authentication では、ユーザー固有のエラーが発生した場合であっても、指定されたユーザーのリスト全体のアップロードを試行します。このオペレーションでは、インポートの成功と失敗の概要を含む結果が返されます。エラーの詳細は、失敗したユーザー インポートごとに返されます。

var userImportOptions = {
  hash: {
    algorithm: 'HMAC_SHA256',
    key: Buffer.from('secretKey')
  }
};

admin.auth().importUsers(userImportRecords, userImportOptions)
  .then(function(userImportResult) {
     // The number of successful imports is determined via: userImportResult.successCount.
     // The number of failed imports is determined via: userImportResult.failureCount.
     // To get the error details.
     userImportResult.forEach(function(indexedError) {
        // The corresponding user that failed to upload.
        console.log(userImportRecords[indexedError.index].uid +' failed to import',
            indexedError.error);
     });
  })
  .catch(function(error) {
    // Some unrecoverable error occurred that prevented the operation from running.
  });

パスワード ハッシュが必要でない場合(電話番号、カスタム トークン ユーザー、OAuth ユーザーなど)は、ハッシュ オプションを指定しないでください。

HMAC でパスワードをハッシュしてユーザーをインポートする

HMAC ハッシング アルゴリズムには、HMAC_MD5HMAC_SHA1HMAC_SHA256HMAC_SHA512 などがあります。これらのハッシング アルゴリズムには、ハッシュ署名者鍵を指定する必要があります。

admin.auth().importUsers([{
  uid: 'some-uid',
  email: 'user@example.com',
  // Must be provided in a byte buffer.
  passwordHash: Buffer.from('password-hash'),
  // Must be provided in a byte buffer.
  passwordSalt: Buffer.from('salt')
}], {
  hash: {
    algorithm: 'HMAC_SHA256',
    // Must be provided in a byte buffer.
    key: Buffer.from('secret')
  }
}).then(function(results) {
  results.error.forEach(function(indexedError) {
    console.log('Error importing user ' + indexedError.index.toString(), error);
  });
}).catch(function(error) {
  console.log('Error importing users:', error);
});

MD5、SHA、PBKDF でパスワードをハッシュしてユーザーをインポートする

MD5、SHA、PBKDF ハッシング アルゴリズムには、MD5SHA1SHA256SHA512BPKDF_SHA1PBKDF2_SHA256 などがあります。これらのハッシング アルゴリズムには、パスワードのハッシュに使用されるラウンド数(0〜120,000 の範囲)を指定する必要があります。

admin.auth().importUsers([{
  uid: 'some-uid',
  email: 'user@example.com',
  // Must be provided in a byte buffer.
  passwordHash: Buffer.from('password-hash'),
  // Must be provided in a byte buffer.
  passwordSalt: Buffer.from('salt')
}], {
  hash: {
    algorithm: 'PBKDF2_SHA256',
    rounds: 100000
  }
}).then(function(results) {
  results.error.forEach(function(indexedError) {
    console.log('Error importing user ' + indexedError.index.toString(), error);
  });
}).catch(function(error) {
  console.log('Error importing users:', error);
});

標準の SCRYPT でパスワードをハッシュしてユーザーをインポートする

Firebase Authentication は、標準の SCRYPT アルゴリズムだけでなく、内部で修正されたバージョンもサポートしています。標準の SCRYPT アルゴリズムには、以下のハッシュ パラメータが必須です。

  • memoryCost: ハッシング アルゴリズムの CPU やメモリのコスト。
  • parallelization: ハッシング アルゴリズムの並列化。
  • blockSize: ハッシング アルゴリズムのブロックサイズ(通常は 8)。
  • derivedKeyLength: ハッシング アルゴリズムの派生キーの長さ。
admin.auth().importUsers([{
  uid: 'some-uid',
  email: 'user@example.com',
  // Must be provided in a byte buffer.
  passwordHash: Buffer.from('password-hash'),
  // Must be provided in a byte buffer.
  passwordSalt: Buffer.from('salt')
}], {
  hash: {
    algorithm: 'STANDARD_SCRYPT',
    memoryCost: 1024,
    parallelization: 16,
    blockSize: 8,
    derivedKeyLength: 64
  }
}).then(function(results) {
  results.error.forEach(function(indexedError) {
    console.log('Error importing user ' + indexedError.index.toString(), error);
  });
}).catch(function(error) {
  console.log('Error importing users:', error);
});

BCRYPT でパスワードをハッシュしてユーザーをインポートする

BCRYPT でハッシュされるパスワードには、追加のハッシュ パラメータもユーザーごとのパスワード ソルトも必要ありません。

admin.auth().importUsers([{
  uid: 'some-uid',
  email: 'user@example.com',
  // Must be provided in a byte buffer.
  passwordHash: Buffer.from('password-hash')
}], {
  hash: {
    algorithm: 'BCRYPT'
  }
}).then(function(results) {
  results.error.forEach(function(indexedError) {
    console.log('Error importing user ' + indexedError.index.toString(), error);
  });
}).catch(function(error) {
  console.log('Error importing users:', error);
});

Firebase SCRYPT でパスワードをハッシュしてユーザーをインポートする

SCRYPT ハッシンング アルゴリズムの Firebase の修正バージョンを使用してハッシュされたパスワードをインポートすると、別の既存の Firebase プロジェクトからユーザーを移行するのに便利です。この処理を行うには、元のプロジェクトの内部パラメータを判別する必要があります。

Firebase では、Firebase プロジェクトごとに固有のパスワード ハッシュ パラメータを生成します。これらのパラメータにアクセスするには、Firebase コンソールの [ユーザー] タブに移動し、ユーザーのテーブルリストの右上隅にあるプルダウンから [パスワード ハッシュ パラメータ] を選択します。

このアルゴリズムのハッシュ オプションを構成するのに必要なパラメータは、次のとおりです。

  • key: 通常は base64 エンコードで提供される署名者鍵。
  • saltSeparator: 通常は base64 エンコードで提供されるソルトの区切り(省略可能)。
  • rounds: パスワードのハッシュに使用されるラウンド数。
  • memoryCost: このアルゴリズムに必要なメモリコスト。
admin.auth().importUsers([{
  uid: 'some-uid',
  email: 'user@example.com',
  // Must be provided in a byte buffer.
  passwordHash: Buffer.from('base64-password-hash', 'base64'),
  // Must be provided in a byte buffer.
  passwordSalt: Buffer.from('base64-salt', 'base64')
}], {
  hash: {
    algorithm: 'SCRYPT',
    // All the parameters below can be obtained from the Firebase Console's users section.
    // Must be provided in a byte buffer.
    key: Buffer.from('base64-secret', 'base64'),
    saltSeparator: Buffer.from('base64SaltSeparator', 'base64'),
    rounds: 8,
    memoryCost: 14
  }
}).then(function(results) {
  results.error.forEach(function(indexedError) {
    console.log('Error importing user ' + indexedError.index.toString(), error);
  });
}).catch(function(error) {
  console.log('Error importing users:', error);
});

パスワードなしでユーザーをインポートする

パスワードなしでユーザーをインポートできます。パスワードなしのユーザーは、OAuth プロバイダ、カスタム クレーム、電話番号などを使用するユーザーと組み合わせてインポートすることができます。

admin.auth().importUsers([{
  uid: 'some-uid',
  displayName: 'John Doe',
  email: 'johndoe@gmail.com',
  photoURL: 'http://www.example.com/12345678/photo.png',
  emailVerified: true,
  phoneNumber: '+11234567890',
  // Set this user as admin.
  customClaims: {admin: true},
  // User with Google provider.
  providerData: [{
     uid: 'google-uid',
     email: 'johndoe@gmail.com',
     displayName: 'John Doe',
     photoURL: 'http://www.example.com/12345678/photo.png',
     providerId: 'google.com'
  }]
}]).then(function(results) {
  results.error.forEach(function(indexedError) {
    console.log('Error importing user ' + indexedError.index.toString(), error);
  });
}).catch(function(error) {
  console.log('Error importing users:', error);
});

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。