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

Web端基于Firebase添加Google登录功能技术咨询

完善Web端Firebase Google登录流程

我已经在移动端实现了基于Firebase的Google注册登录功能,Firebase后台也完成了Google账号配置,现在需要在Web端添加Google登录按钮。目前已有完整的用户名密码登录代码,也编写了部分Google登录代码,但后续认证流程未完善——当前Google登录弹窗可正常弹出并完成账号输入,但后续流程无法继续推进。

现有用户名密码登录代码

private submitForm = async(e: any) => {
  e.preventDefault();
  if (validateForm(this)) {
    const st = this.state;
    const model = {
      email: st.email.value,
      password: st.password.value
    };
    this.setState({
      showLoader: true
    });
    firebase.app().auth().signInWithEmailAndPassword(model.email, model.password).then(async(result: any) => {
      if (result) {
        const userDetail = await getVendorDetail({
          uid: result.user.uid
        });
        if (userDetail && userDetail.status === 200) {
          if (userDetail && userDetail.data.role === "user") {
            this.setState({
              showLoader: false
            });
            setStorage(CONSTANT.keys.token, userDetail.data.token);
            setStorage(CONSTANT.keys.userDetail, {
              uid: userDetail.data.uid,
              displayName: userDetail.data.displayName,
              email: userDetail.data.email,
              photoURL: userDetail.data.photoURL
            });
            if (userDetail.data.isVendorPlanSubscribed) {
              window.location.href = CONSTANT.url.dashboard;
            }
          } else {
            this.setState({
              showLoader: false
            });
            toast.error("你没有登录权限");
          }
        } else if (userDetail && userDetail.status === 400) {
          this.setState({
            showLoader: false
          });
          toast.error(userDetail.message);
        }
      }
    }).catch((error: any) => {
      this.setState({
        showLoader: false
      });
      if (error && error.code === "auth/user-not-found") {
        toast.error(error.message);
      }
      if (error && error.code === "auth/wrong-password") {
        toast.error(error.message);
      }
    });
  }
}

待完善的Google登录代码

private googleLogin() {
  const provider = new firebase.auth.GoogleAuthProvider();
  firebase.auth().signInWithPopup(provider)
    .then(async(result: any) => {
      const user = result.user;
      console.log(user);
    })
    .catch(console.log)
}

完善后的Google登录代码及说明

你需要将Google登录后的流程与用户名密码登录逻辑对齐,主要补充以下内容:

  • 加载状态管理
  • 后端用户权限验证
  • 本地用户信息存储
  • 权限结果处理(跳转/无权限提示)
  • 错误捕获与友好提示

完善后的代码如下:

private googleLogin = async() => {
  this.setState({ showLoader: true }); // 开启加载状态
  const provider = new firebase.auth.GoogleAuthProvider();
  
  try {
    const result = await firebase.auth().signInWithPopup(provider);
    const user = result.user;
    
    if (user) {
      // 调用后端接口验证用户身份和权限,与用户名密码登录逻辑一致
      const userDetail = await getVendorDetail({ uid: user.uid });
      
      if (userDetail && userDetail.status === 200) {
        if (userDetail.data.role === "user") {
          this.setState({ showLoader: false });
          // 存储token和用户信息到本地,优先用后端数据,无则用Google返回的基础信息
          setStorage(CONSTANT.keys.token, userDetail.data.token);
          setStorage(CONSTANT.keys.userDetail, {
            uid: userDetail.data.uid,
            displayName: userDetail.data.displayName || user.displayName,
            email: userDetail.data.email || user.email,
            photoURL: userDetail.data.photoURL || user.photoURL
          });
          // 根据订阅状态跳转对应页面
          if (userDetail.data.isVendorPlanSubscribed) {
            window.location.href = CONSTANT.url.dashboard;
          }
        } else {
          this.setState({ showLoader: false });
          toast.error("你没有登录权限");
        }
      } else if (userDetail && userDetail.status === 400) {
        this.setState({ showLoader: false });
        toast.error(userDetail.message);
      }
    }
  } catch (error: any) {
    this.setState({ showLoader: false });
    // 处理Firebase Google登录的各类错误
    if (error.code === "auth/popup-closed-by-user") {
      toast.error("登录弹窗已关闭");
    } else if (error.code === "auth/cancelled-popup-request") {
      toast.error("登录请求已取消");
    } else {
      toast.error(`登录失败:${error.message}`);
    }
    console.error("Google登录错误:", error);
  }
}

关键补充点说明

  1. 加载状态同步:登录开始时开启加载,结束(成功/失败)时关闭,保持与用户名密码登录的交互一致性
  2. 后端权限校验:必须调用getVendorDetail接口,确认该Google账号是否在系统中注册、是否拥有合法权限,这是衔接自有业务逻辑的核心步骤
  3. 用户信息兼容:优先存储后端返回的用户数据,若后端未返回昵称、头像等信息,则用Google账号自带的信息补充
  4. 错误场景覆盖:针对Google登录的特有错误(如弹窗关闭、请求取消)给出明确提示,提升用户体验

内容的提问来源于stack exchange,提问作者Jason

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 11:55:28