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

Flutter集成Firebase Google登录无法获取用户手机号求助

Flutter Firebase Google登录无法获取手机号的解决方案

核心原因

Google Sign-In默认不会请求用户手机号权限,且Firebase Auth不会自动同步Google账号的手机号信息——哪怕你的Gmail账号绑定了手机号,Firebase用户对象的phoneNumber字段也不会自动填充。

具体解决步骤

  • 添加手机号权限Scope
    初始化GoogleSignIn时,必须明确添加获取用户手机号的权限Scope,否则无法拿到相关数据:

    final GoogleSignIn googleSignIn = GoogleSignIn(
      scopes: [
        'email',
        'https://www.googleapis.com/auth/userinfo.profile',
        'https://www.googleapis.com/auth/userinfo.phone', // 新增手机号权限Scope
      ],
    );
    
  • 通过Google People API获取手机号
    Firebase Auth的User对象不会自动携带Google账号的手机号,你需要通过Google Sign-In返回的GoogleSignInAccount,调用Google People API获取:

    // 获取googleUser后,添加以下代码
    final http.Response response = await http.get(
      Uri.parse('https://people.googleapis.com/v1/people/me?personFields=phoneNumbers'),
      headers: await googleUser.authHeaders,
    );
    
    if (response.statusCode == 200) {
      final Map<String, dynamic> data = json.decode(response.body);
      final List<dynamic>? phoneNumbers = data['phoneNumbers'];
      if (phoneNumbers != null && phoneNumbers.isNotEmpty) {
        final String? phoneNumber = phoneNumbers[0]['value'];
        // 此处拿到用户手机号
        print('手机号:$phoneNumber');
      }
    }
    

    注意:需先在pubspec.yaml中添加http依赖。

  • 修复空指针错误
    原代码中直接使用user.phoneNumber!会触发空指针,改成空值安全处理:

    print("data:"
        + ' email: ' + (user.email ?? "未获取到邮箱")
        + ', name: ' + (user.displayName ?? "未获取到昵称")
        + ', avatar: ' + (user.photoURL ?? "未获取到头像")
        + ', phone: ' + (user.phoneNumber ?? "未获取到手机号")
    );
    

补充说明

如果需要将手机号绑定到Firebase用户对象中,可在拿到手机号后调用user.updatePhoneNumber()方法,但需额外完成手机号验证流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:03:39