React Native实现Google登录后将用户数据保存至Firebase
React Native Google登录后将用户数据保存到Firebase
实现步骤
要把Google登录的用户数据存入Firebase,需完成Firebase认证关联和用户数据存储两步,以下是具体实现:
- 依赖准备
确保项目已安装并配置好以下依赖:
@react-native-google-signin/google-signin(你现有代码已集成)@react-native-firebase/auth:用于Firebase身份认证@react-native-firebase/firestore(或@react-native-firebase/database,根据你选择的数据库类型)
- 修改登录函数,添加Firebase处理逻辑
在现有googleLogin函数中,补充认证和数据存储代码:
import auth from '@react-native-firebase/auth'; import firestore from '@react-native-firebase/firestore'; import { GoogleSignin, statusCodes } from '@react-native-google-signin/google-signin'; const googleLogin = async () => { try { await GoogleSignin.hasPlayServices(); const userInfo = await GoogleSignin.signIn(); console.log(userInfo); // 已获取到Google用户数据 // 1. 从Google登录结果中获取idToken,创建Firebase认证凭证 const googleCredential = auth.GoogleAuthProvider.credential(userInfo.idToken); // 2. 使用凭证完成Firebase用户认证 const firebaseUser = await auth().signInWithCredential(googleCredential); console.log('Firebase登录成功:', firebaseUser.user); // 3. 将用户数据保存到Firebase Firestore await firestore() .collection('users') // 自定义用户集合名称 .doc(firebaseUser.user.uid) // 用Firebase用户ID作为文档ID,避免重复存储 .set({ uid: firebaseUser.user.uid, name: userInfo.user.name, email: userInfo.user.email, photoUrl: userInfo.user.photo, createdAt: firestore.FieldValue.serverTimestamp(), // 记录服务器时间戳 }, { merge: true }); // merge: true 表示存在则更新、不存在则创建 console.log('用户数据已保存到Firebase'); } catch (error) { if (error.code === statusCodes.SIGN_IN_CANCELLED) { // 用户取消登录流程 } else if (error.code === statusCodes.IN_PROGRESS) { // 登录操作已在进行中 } else if (error.code === statusCodes.PLAY_SERVICES_NOT_AVAILABLE) { // 谷歌服务不可用或版本过低 } else { console.error('登录或存储失败:', error); } } };
关键说明
- Firebase认证关联:通过
GoogleAuthProvider.credential将Google的idToken转换为Firebase可识别的凭证,完成用户认证后,用户会被记录在Firebase Auth的用户列表中。 - 数据存储优化:
set({ merge: true })可以避免覆盖已存在的用户数据,新用户创建文档、老用户仅更新变动字段。 - 实时数据库替代写法:如果使用Firebase实时数据库,替换Firestore代码为:
await database() .ref(`users/${firebaseUser.user.uid}`) .set({ uid: firebaseUser.user.uid, name: userInfo.user.name, email: userInfo.user.email, photoUrl: userInfo.user.photo, createdAt: new Date().toISOString(), });
内容的提问来源于stack exchange,提问作者vivek kn
相关产品推荐
相关产品推荐

