Flutter中邮箱验证完成后如何将用户数据保存至Firestore?
邮箱验证完成后将用户数据存入Firestore的实现方案
核心思路
通过监听Firebase Auth的用户状态变化,检测到邮箱验证完成的状态后,将用户数据写入Firestore的users集合,同时通过安全规则确保数据写入的合法性。
具体实现步骤
1. 监听用户认证状态,触发数据写入
在客户端代码中,监听用户登录状态变化,当检测到用户邮箱已验证且未在Firestore中创建过文档时,执行写入操作:
// 监听用户认证状态变更 firebase.auth().onAuthStateChanged((user) => { if (user && user.emailVerified) { const userDocRef = firebase.firestore().collection('users').doc(user.uid); // 先检查文档是否存在,避免重复写入 userDocRef.get().then((docSnapshot) => { if (!docSnapshot.exists) { // 写入用户基础数据 userDocRef.set({ uid: user.uid, email: user.email, displayName: user.displayName || '未设置昵称', createdAt: firebase.firestore.FieldValue.serverTimestamp(), emailVerified: true }) .then(() => console.log('用户数据已成功存入Firestore')) .catch(err => console.error('写入失败:', err)); } }); } });
2. 验证跳转页主动触发更新(可选)
如果用户点击验证链接后跳转到指定页面,可以在该页面主动刷新用户状态并更新Firestore数据:
// 在邮箱验证成功的跳转页面执行 firebase.auth().currentUser.reload().then(() => { const user = firebase.auth().currentUser; if (user.emailVerified) { firebase.firestore() .collection('users') .doc(user.uid) .set( { emailVerified: true, verifiedAt: firebase.firestore.FieldValue.serverTimestamp() }, { merge: true } // 仅更新指定字段,不覆盖已有数据 ) .then(() => console.log('验证状态已同步到Firestore')); } });
3. 配置Firestore安全规则
确保只有用户本人能写入自己的文档,避免非法数据写入:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /users/{userId} { allow write: if request.auth != null && request.auth.uid == userId; allow read: if request.auth != null && request.auth.uid == userId; } } }
内容的提问来源于stack exchange,提问作者Mohammed Malek
相关产品推荐
相关产品推荐

