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
相关产品推荐
相关产品推荐

