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

Flutter Web集成Google Sign In问题:无法获取idToken及serverAuthCode为空

问题分析与解决方案

一、serverAuthCode为null的原因及解决办法

核心原因

  1. 未请求离线访问权限:serverAuthCode是用于服务器端离线获取令牌的凭证,必须明确向Google请求离线访问权限,否则不会返回该字段。
  2. 客户端ID配置错误:使用了非Web类型的客户端ID(如Android/iOS端的ID),或未在Google Cloud Console中配置正确的重定向URI、JavaScript来源。
  3. Scope不完整:缺少openid这类核心权限范围,导致无法触发serverAuthCode的返回逻辑。

修复步骤

  1. 确认客户端ID类型:
    在Google Cloud Console中创建Web应用类型的客户端ID,而非移动应用类型。同时配置正确的:
    • 授权重定向URI:本地测试填http://localhost:你的端口号,生产环境填你的域名(如https://your-domain.com/)
    • JavaScript来源:与重定向URI保持一致即可
  2. 开启离线访问请求:
    修改Web端登录按钮的渲染代码,添加离线访问配置:
    Widget buildSignInButton({HandleSignInFn? onPressed}) {
      return (GoogleSignInPlatform.instance as web.GoogleSignInPlugin)
          .renderButton(
        config: web.GoogleSignInButtonConfiguration(
          requestOfflineAccess: true, // 关键:开启离线访问请求
        ),
      );
    }
    
  3. 补充必要Scope:
    初始化GoogleSignIn时添加openid scope:
    final GoogleSignIn _googleSignIn = GoogleSignIn(
      clientId: '你的Web客户端ID',
      signInOption: SignInOption.standard,
      scopes: [
        'email',
        'openid', // 必须添加该scope
      ],
    );
    

二、获取idToken的实现方法

操作步骤

  1. 确保Scope包含openid:
    如上述,openid是获取idToken的必要前提,必须在初始化时加入scopes列表。
  2. 登录后获取认证信息:
    在用户登录状态变更的监听中,调用account.authentication()获取包含idToken的对象:
    _googleSignIn.onCurrentUserChanged.listen((GoogleSignInAccount? account) async {
      if (account != null) {
        // 获取idToken和accessToken
        GoogleSignInAuthentication auth = await account.authentication();
        debugPrint('idToken: ${auth.idToken}');
        debugPrint('accessToken: ${auth.accessToken}');
    
        // 后续可将idToken发送至后端进行身份验证
      }
    });
    
  3. 验证客户端ID的JavaScript来源配置:
    确保Google Cloud Console中Web客户端ID的JavaScript来源与你的Web应用域名/本地地址一致,否则会被Google拦截token请求。

额外注意事项

  • 本地测试时必须使用http://localhost而非127.0.0.1,两者在Google的权限配置中不互通。
  • 若仍有问题,检查Google Cloud Console是否启用了Google Identity Toolkit API(部分场景下需要)。
  • 需重新获取token时,可调用_googleSignIn.signInSilently()触发认证信息更新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 17:58:22