启用邮箱枚举保护后,React Native中如何关联匿名用户与邮箱提供商?
如何在React Native(firebase@10.4.0)中将匿名用户关联到邮箱提供商
背景说明
2023年9月15日及之后创建的Google Cloud项目,邮箱枚举保护默认启用,导致原本关联匿名用户与邮箱的方法失效:
无法再使用
setAccountInfoREST API将邮箱/密码提供商关联到现有用户账户;也无法在任何平台使用带EmailAuthCredential的linkWithCredential客户端SDK方法。必须改用signUpREST API,传入用户的ID Token、邮箱和密码字段来完成关联。
旧方法(已失效)
const authLinkAccountWithEmailCredential = async (email, password) => { try { const credential = EmailAuthProvider.credential(email, password); linkWithCredential(user, credential).then((userCredential) => { const newUser = userCredential.user; setUser(newUser); }); } catch (error) { console.log("AUTH LINK ACCOUNT WITH EMAIL CREDENTIAL", error); } };
新解决方案:调用signUp REST API
由于firebase@10.4.0的客户端SDK未提供对应封装方法,需直接调用Identity Platform的REST API完成关联,步骤如下:
- 获取当前匿名用户的ID Token
- 构造POST请求,传入ID Token、邮箱和密码
- 处理API响应,更新本地用户状态
React Native代码示例
import { getAuth, getIdToken } from 'firebase/auth'; const linkAnonymousUserWithEmail = async (email, password) => { const auth = getAuth(); const user = auth.currentUser; if (!user || user.isAnonymous === false) { console.error("当前用户不是匿名用户"); return; } try { // 获取匿名用户的ID Token const idToken = await getIdToken(user); // 调用Identity Platform的signUp API const response = await fetch('https://identitytoolkit.googleapis.com/v1/accounts:signUp?key=你的Firebase项目API密钥', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ idToken: idToken, email: email, password: password, returnSecureToken: true, }), }); const data = await response.json(); if (!response.ok) { throw new Error(data.error?.message || '关联失败'); } // 成功后刷新用户信息 await user.reload(); setUser(auth.currentUser); console.log("匿名用户关联邮箱成功"); } catch (error) { console.log("AUTH LINK ANONYMOUS USER WITH EMAIL", error); } };
注意:需将代码中的你的Firebase项目API密钥替换为实际的Firebase项目Web API密钥,可在Firebase控制台「项目设置」>「常规」页面获取。
内容的提问来源于stack exchange,提问作者David Henry
相关产品推荐
相关产品推荐

