Firebase/GCP多租户项目同一邮箱重复创建用户问题排查
同一邮箱重复创建Firebase用户账号问题排查求助
我们运营着一个基于Firebase/GCP的多租户网站,近期发现某租户下出现同一邮箱对应多个不同UID用户账号的异常情况,甚至有用户成功创建了9个同邮箱账号,核查后确认这些账号的注册IP地址均不相同。
根据谷歌官方说明:
默认情况下,用户无法在Firebase中直接创建多个同一邮箱的账号,平台设计为每个邮箱仅关联一个用户账号;但通过不同登录方式(如Google登录和邮箱/密码登录)可实现同一邮箱对应不同用户档案。
但我们仅启用了邮箱/密码这一种身份提供商,完全不符合官方说明里的例外场景,这种情况为何会发生?
以下是注册流程的核心代码片段:
/** * @type {import('firebase/auth').UserCredential} */ const userRecord = await createUserWithEmailAndPassword(auth, email, password).catch( (error) => { return error; } ); userId = userRecord?.user?.uid; // @ts-ignore if (userRecord?.code) { // @ts-ignore return statusCallback({ submitting: false, code: userRecord.code, error: true }); } //Set User Records On Server delete formObject.password; //# Update User with displayname const userUpdate = await updateProfile(userRecord.user, { displayName: username }); let token = await userRecord.user.getIdToken(false); const parsedToken = parseJwtClient(token); // Get updated token. If needed. if (parsedToken?.['https://hasura.io/jwt/claims']) { token = await getLoginToken(userRecord); } if (!token) { signOutGA(); return statusCallback({ submitting: false, code: 'auth/invalid-oauth-provider', error: true }); } // Prepare data for API call const postData = { user: formObject, guser: userRecord.user }; // Send data to register API const result = await request('/api/register', 'POST', postData, token).then((response) => response.json() ); if (result?.error || result?.code) { if (auth.currentUser) { await deleteUser(auth.currentUser); } return signupError(result, statusCallback); } // Set JWT token jwtToken.set(() => token); // Fetch user data const user = await fetchUser(token); // Set player data player.set(user);
当前问题影响:
- 我们的业务数据库仅允许同一邮箱存在一条记录,现在无法确定Firebase返回的用户账号是否与数据库记录匹配
- 用户反馈要么登录时提示「密码错误」,要么登录成功后因JWT中的UID与数据库记录不符,无法获取业务数据
- 该异常已出现4-5次,平台总用户量超10k,但仅少数用户遇到
- 注册表单基于Svelte实现,点击提交按钮后会禁用按钮和页面,理论上不会出现重复提交
现在想请教:谷歌Firebase的默认校验逻辑为何失效?有哪些排查方向可以定位问题根源?
内容的提问来源于stack exchange,提问作者siniradam
相关产品推荐
相关产品推荐

