如何在Firebase Firestore中通过用户邮箱获取其uid
通过邮箱获取Firebase用户UID(Flutter + Firestore)
Firebase客户端Auth SDK出于隐私安全限制,没有提供直接通过邮箱查询用户UID的接口。要实现这个需求,最可靠的方式是在用户注册时,把邮箱和UID的映射关系存储到Firestore中,之后通过查询这个映射集合来获取对应UID。
1. 注册时存储邮箱-UID映射
用户完成注册后,将邮箱作为文档ID(方便快速查询),把UID和邮箱存入Firestore的user_emails集合:
import 'package:firebase_auth/firebase_auth.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; Future<void> saveEmailUidPair() async { final currentUser = FirebaseAuth.instance.currentUser; if (currentUser == null) return; await FirebaseFirestore.instance .collection('user_emails') .doc(currentUser.email) .set({ 'uid': currentUser.uid, 'email': currentUser.email, }); }
2. 通过邮箱查询UID
需要获取UID时,直接查询user_emails集合中对应邮箱的文档:
import 'package:cloud_firestore/cloud_firestore.dart'; Future<String?> fetchUidByEmail(String targetEmail) async { try { final docSnapshot = await FirebaseFirestore.instance .collection('user_emails') .doc(targetEmail) .get(); if (docSnapshot.exists) { return docSnapshot.data()?['uid'] as String; } // 邮箱未注册,返回null return null; } catch (error) { print('查询UID失败: $error'); return null; } }
关键注意事项
- 安全规则配置:一定要给
user_emails集合设置合理的安全规则,防止敏感数据泄露。比如只允许已登录用户查询,且用户只能修改自己的映射:match /user_emails/{emailDoc} { allow read: if request.auth != null; allow write: if request.auth != null && request.auth.token.email == emailDoc; } - 数据同步:如果用户后续修改邮箱,记得同步更新
user_emails集合中的文档(删除旧邮箱文档,新增新邮箱的映射),避免数据不一致。
内容的提问来源于stack exchange,提问作者jana Diriyeh
相关产品推荐
相关产品推荐

