FirebaseAuthのfetchSignInMethodsForEmailがdeprecatedになっていて、少し設定を加えないと正しくデータが取得できなかったので書きました。
該当のメアドのアカウントで過去にログイン済みかどうかを判断したいケースがある場合に使ったりするメソッドです。
メアドが過去に使用されたことがあるかを確認する方法
Firebase Authenticationを使用してメールアドレスでログインを実装する場合、fetchSignInMethodsForEmail(email)
メソッドを使用すると、指定したメールアドレスが過去にどのログイン方法で使用されたかのリストを取得できます。
以下のコードは、指定したメールアドレスが既に登録されているかどうかを確認する例です。
Future<void> checkEmailRegistered(String email) async {
try {
List<String> signInMethods = await auth.fetchSignInMethodsForEmail(email);
return signInMethods.isNotEmpty;
} catch (e) {
print("エラー: $e");
}
}
例えば、メールアドレスとパスワードでログインしている場合、レスポンスのリストに"password"が含まれます。リストが空の場合は、そのメールアドレスでログインしたことがないことを意味し、空でない場合はログインしたことがあると判断できます。
fetchSignInMethodsForEmailがDeprecatedに!?
2023年9月15日以降、新しいFirebaseプロジェクトではメール列挙攻撃に対する保護がデフォルトで有効になり、fetchSignInMethodsForEmail
メソッドが機能しなくなってました。
以下のドキュメントによると、「指定されたメールアドレスのサインイン方法のリストは、createAuthUri REST APIを呼び出しても、すべてのプラットフォームでfetchSignInMethodsForEmailクライアントSDKメソッドを呼び出しても返されなくなります」
とのことでした。
解決方法
このメール列挙攻撃に対する保護を無効にすることで、fetchSignInMethodsForEmail
メソッドを再び使用できるようになります。以下はその手順です。
- Firebaseコンソールを開きます。
- FirebaseAuthの設定ページに移動します。
- メール列挙攻撃に対する保護を無効に設定します。
保護を無効にする前に、メール列挙攻撃に対する保護の意味を理解し、リスクを検討した上で無効にするかどうかを判断してください。
2度目にはなりますが、大事なのでURLをもう一度貼っておきます。
他の方法
Firestoreデータベースにあるメールアドレスを参照して、アカウントの存在を確認する方法もありますが、手間がかかり、セキュリティ面でのリスクも考慮する必要があります。そのため、上記の方法を推奨します。
まとめ
fetchSignInMethodsForEmail
がDeprecatedになったものの、メール列挙攻撃に対する保護を無効にすることで、再び使用可能です。
ただし、既にDeprecatedであることはもちろん、無効にすることにはセキュリティ上のリスクが伴うため、慎重に検討してください。