如何在Flutter中对Google Forms API请求进行身份验证?
在Flutter中用OAuth 2.0客户端ID验证Google Forms API请求
Google Forms API的/responses端点必须用OAuth 2.0授权,不能用普通API密钥——因为它要访问用户的私有表单数据。你手里的JSON凭证是OAuth客户端配置,得通过用户登录拿到有效的访问令牌(Access Token)才能完成验证。
实现步骤
1. 添加依赖
在pubspec.yaml里添两个必要的包:
dependencies: flutter: sdk: flutter google_sign_in: ^5.4.0 # 处理Google账号登录 googleapis: ^11.0.0 # Google官方API客户端库
执行flutter pub get完成安装。
2. 配置OAuth客户端ID
- 回到Google Cloud控制台,确认你创建的客户端ID匹配你的Flutter平台(Android/iOS/WEB)。
- 按平台要求放置凭证文件:
- Android:把
google-services.json放到android/app/目录下 - iOS:把
GoogleService-Info.plist放到ios/Runner/目录下 - WEB:在
web/index.html中添加Google登录的配置脚本(参照Google官方配置说明)
- Android:把
3. 实现登录流程获取访问令牌
先完成Google账号登录,拿到能访问Forms API的令牌:
import 'package:google_sign_in/google_sign_in.dart'; import 'package:googleapis/forms/v1.dart' as forms; // 声明需要的权限:只读访问表单响应 final List<String> scopes = [forms.FormsApi.formsResponsesReadonlyScope]; final GoogleSignIn _googleSignIn = GoogleSignIn( scopes: scopes, clientId: '你的客户端ID', // 从JSON凭证中提取client_id字段填入 ); // 获取访问令牌的函数 Future<String?> getAccessToken() async { try { final GoogleSignInAccount? account = await _googleSignIn.signIn(); final GoogleSignInAuthentication auth = await account!.authentication; return auth.accessToken; } catch (e) { print('登录失败: $e'); return null; } }
4. 使用令牌调用Forms API
替换你原来的请求代码,将Authorization头替换为OAuth访问令牌:
import 'package:http/http.dart' as http; import 'package:http/http.dart'; Future<void> fetchFormResponses() async { final String? accessToken = await getAccessToken(); if (accessToken == null) return; final String formId = '你的表单ID'; final Uri url = Uri.parse('https://forms.googleapis.com/v1/forms/$formId/responses'); final Response response = await http.get( url, headers: { 'Authorization': 'Bearer $accessToken', // 格式必须为「Bearer + 空格 + 令牌」 }, ); if (response.statusCode == 200) { print('响应数据: ${response.body}'); } else { print('请求失败: ${response.statusCode} - ${response.body}'); } }
注意事项
- 必须先在Google Cloud项目中启用Google Forms API(前往API库搜索并启用)。
- 测试用的Google账号需要拥有目标表单的访问权限(比如是表单创建者,或已被授权查看响应)。
- 访问令牌存在过期时间,若需要长期访问,可以结合刷新令牌(Refresh Token)实现自动更新,避免重复要求用户登录。
内容的提问来源于stack exchange,提问作者Mikhail Beresnev
相关产品推荐
相关产品推荐

