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

Flutter集成Google OAuth2登录时_idToken为空的问题咨询

Flutter Google登录无法获取_idToken的原因及解决方法

我正在开发Flutter应用,需集成Google登录功能,已通过Google Cloud OAuth完成基础登录集成,但登录成功响应中_idToken为空。我需要用_idToken在后端验证用户身份,请问为何无法获取_idToken,应如何解决?

相关代码

main.dart

import 'dart:developer';

import 'package:flutter/material.dart';
import 'package:flutter_application_2/api/google_signin_api.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});
  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
            ElevatedButton(onPressed: signIn, child: const Text("Click"))
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }

  Future signIn() async {
    final user = await GoogleSignInApi.login();
    //print(user.idtoken)
    inspect(user);
  }
}

google_signin_api.dart

import 'package:google_sign_in/google_sign_in.dart';

class GoogleSignInApi {
  static final _googleSignIn = GoogleSignIn();

  static Future<GoogleSignInAccount?> login() async {
    return _googleSignIn.signIn();
  }
}

无法获取_idToken的原因

直接调用signIn()只会获取用户基础信息(姓名、邮箱等),不会触发ID Token的请求。要获取ID Token,必须在初始化GoogleSignIn时指定Web客户端ID,并明确添加openid和email的授权范围,让Google OAuth服务返回包含ID Token的认证信息。

解决步骤

  • 获取Web客户端ID:登录Google Cloud控制台,进入「API和服务」→「凭据」,找到对应项目的OAuth 2.0客户端ID,复制其中的Web客户端ID(不要用Android/iOS客户端ID)。

  • 修改GoogleSignIn初始化逻辑:更新google_signin_api.dart代码,传入客户端ID并指定授权范围,同时获取认证信息中的ID Token:

import 'package:google_sign_in/google_sign_in.dart';

class GoogleSignInApi {
  // 替换为你的Web客户端ID
  static const _clientId = '你的Web客户端ID.apps.googleusercontent.com';
  static final _googleSignIn = GoogleSignIn(
    clientId: _clientId,
    scopes: [
      'email',
      'openid',
    ],
  );

  static Future<GoogleSignInAccount?> login() async {
    final account = await _googleSignIn.signIn();
    // 获取包含ID Token的认证信息
    if (account != null) {
      final auth = await account.authentication;
      print('获取到的ID Token: ${auth.idToken}');
    }
    return account;
  }
}
  • 在主页面中获取ID Token:修改main.dart中的signIn方法,直接从用户认证信息中提取ID Token:
Future signIn() async {
  final user = await GoogleSignInApi.login();
  if (user != null) {
    final auth = await user.authentication;
    print('ID Token: ${auth.idToken}');
  }
  inspect(user);
}
  • 验证Cloud配置正确性:
    • 确保OAuth客户端ID已关联应用的包名(Android)或Bundle ID(iOS);
    • 检查客户端ID的授权重定向URI是否包含对应平台的回调地址(如Android的com.googleusercontent.apps.xxx:/oauth2redirect)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:05:23