You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 19:30:11