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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 16:27:15