在Flutter中基于Firebase ID Token创建认证HTTP客户端对接Google API
解决方案:用Firebase ID Token创建认证HTTP客户端调用Google API
核心逻辑
Firebase ID Token无法直接调用大部分Google API,需要先将其交换为Google OAuth2访问令牌,再用该令牌完成HTTP请求的身份认证。
步骤1:交换Firebase ID Token为Google访问令牌
调用Google的令牌端点,传入Firebase ID Token换取访问令牌。需要用到你Firebase项目的Web API密钥(可在Firebase控制台项目设置中找到)。
import 'dart:convert'; import 'package:http/http.dart' as http; // 替换为你的Firebase项目Web API密钥 const String firebaseWebApiKey = "YOUR_FIREBASE_WEB_API_KEY"; Future<String?> _exchangeFirebaseTokenForGoogleAccessToken(String firebaseIdToken) async { final response = await http.post( Uri.parse("https://securetoken.googleapis.com/v1/token?key=$firebaseWebApiKey"), body: jsonEncode({ "grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer", "assertion": firebaseIdToken, "audience": "https://oauth2.googleapis.com/token" }), headers: {"Content-Type": "application/json"}, ); if (response.statusCode == 200) { final data = jsonDecode(response.body); return data["access_token"]; } else { print("令牌交换失败: ${response.body}"); return null; } }
步骤2:创建带认证的HTTP客户端
封装一个自定义HTTP客户端,自动在请求头中添加认证信息,避免重复编写认证逻辑:
import 'package:http/http.dart' as http; class AuthenticatedHttpClient extends http.BaseClient { final http.Client _inner = http.Client(); final String _accessToken; AuthenticatedHttpClient(this._accessToken); @override Future<http.StreamedResponse> send(http.BaseRequest request) { request.headers["Authorization"] = "Bearer $_accessToken"; return _inner.send(request); } }
步骤3:完整调用流程示例
结合你已有的Firebase ID Token获取代码,完整调用Google API的流程如下:
Future<void> callGoogleApi() async { // 1. 获取Firebase ID Token await _getFirebaseIdToken(); if (_firebaseIdToken == null) return; // 2. 交换为Google访问令牌 final googleAccessToken = await _exchangeFirebaseTokenForGoogleAccessToken(_firebaseIdToken!); if (googleAccessToken == null) return; // 3. 创建认证客户端并调用API(以People API为例) final client = AuthenticatedHttpClient(googleAccessToken); final response = await client.get(Uri.parse("https://people.googleapis.com/v1/people/me?personFields=names")); if (response.statusCode == 200) { print("API响应: ${response.body}"); } else { print("API调用失败: ${response.body}"); } // 关闭客户端释放资源 client.close(); }
注意事项
- 令牌过期处理:Firebase ID Token和Google访问令牌有效期均为1小时,过期前需重新获取/交换。可通过
user.getIdToken(true)强制刷新Firebase Token,再重新交换访问令牌。 - API权限配置:确保在Google Cloud控制台中启用了要调用的API(如People API、Drive API等),并为用户分配了对应权限(可通过Firebase Auth用户Claims或Google Cloud IAM配置)。
内容的提问来源于stack exchange,提问作者Constantin DJEGO
相关产品推荐
相关产品推荐

