Flutter Google API认证插件googleapis_auth的使用
Flutter Google API认证插件googleapis_auth的使用
注意事项
注意: 不要在Flutter应用中直接使用
package:googleapis_auth
。请改用extension_google_sign_in_as_googleapis_auth包。
使用此包
使用googleapis_auth
包需要创建一个Google Cloud Project并为特定的应用程序类型获取应用程序凭据。所需步骤如下:
- 在Google Developers Console上创建一个新的Google Cloud Project。
- 在Google Developers Console上启用应用程序将要使用的所有API(在DevConsole -> Project -> APIs & auth -> APIs下)。
- 在Google Developers Console上为特定的应用程序类型获取应用程序凭据(在DevConsole -> Project -> APIs & auth -> Credentials下)。
- 使用
googleapis_auth
包来获取访问凭据或获取已验证的HTTP客户端。
根据应用程序类型,有不同方式实现第三步和第四步。以下是支持的OAuth2流程列表及其描述。
客户端Web应用程序
对于仅限客户端的Web应用程序,需要创建一个“Client ID”(在DevConsole -> Project -> APIs & auth -> Credentials下)。创建新的Client ID时,选择“Web application”类型。对于仅限客户端的应用程序,不需要设置Redirect URIs
。Javascript Origins
设置必须设置为应用程序将服务的所有URL(例如本地测试的http://localhost:8080)。
import 'package:googleapis_auth/auth_browser.dart';
// Initialize the browser oauth2 flow functionality then use it to obtain credentials.
Future<AccessCredentials> obtainCredentials() async {
final flow = await createImplicitBrowserFlow(
ClientId('....apps.googleusercontent.com'),
['scope1', 'scope2'],
);
try {
return await flow.obtainAccessCredentialsViaUserConsent();
} finally {
flow.close();
}
}
或者通过以下方法获取已验证的HTTP客户端:
import 'package:googleapis_auth/auth_browser.dart';
// Initialize the browser oauth2 flow functionality then use it to
// get an authenticated and auto refreshing client.
Future<AuthClient> obtainAuthenticatedClient() async {
final flow = await createImplicitBrowserFlow(
ClientId('....apps.googleusercontent.com'),
['scope1', 'scope2'],
);
try {
return await flow.clientViaUserConsent();
} finally {
flow.close();
}
}
为了防止弹出窗口阻止程序阻止用户授权对话框,最好只在事件处理程序内部调用obtainAccessCredentialsViaUserConsent
和clientViaUserConsent
方法,因为大多数浏览器不会阻止响应用户交互创建的弹出窗口。
已安装/控制台应用程序
对于已安装/控制台应用程序,需要创建一个“Client ID”(在DevConsole -> Project -> APIs & auth -> Credentials下)。创建新的Client ID时,选择“Installed application -> Other”类型。
import 'package:googleapis_auth/auth_io.dart';
import 'package:http/http.dart' as http;
// Use the oauth2 authentication code flow functionality to obtain
// credentials. [prompt] is used for directing the user to a URI.
Future<AccessCredentials> obtainCredentials() async {
final client = http.Client();
try {
return await obtainAccessCredentialsViaUserConsent(
ClientId('....apps.googleusercontent.com', '...'),
['scope1', 'scope2'],
client,
_prompt,
);
} finally {
client.close();
}
}
void _prompt(String url) {
print('Please go to the following URL and grant access:');
print(' => $url');
print('');
}
或者通过以下方法获取已验证的HTTP客户端:
import 'package:googleapis_auth/auth_io.dart';
// Use the oauth2 code grant server flow functionality to
// get an authenticated and auto refreshing client.
Future<AuthClient> obtainCredentials() async => await clientViaUserConsent(
ClientId('....apps.googleusercontent.com', '...'),
['scope1', 'scope2'],
_prompt,
);
void _prompt(String url) {
print('Please go to the following URL and grant access:');
print(' => $url');
print('');
}
自主应用程序/服务账户
如果应用程序希望自主运行并访问例如来自Google Cloud Project的数据,则可以创建一个服务账户。在这种情况下,不需要用户授权。
import "package:googleapis_auth/auth_io.dart";
import "package:http/http.dart" as http;
// Use service account credentials to obtain oauth credentials.
Future<AccessCredentials> obtainCredentials() async {
var accountCredentials = ServiceAccountCredentials.fromJson({
"private_key_id": "<please fill in>",
"private_key": "<please fill in>",
"client_email": "<please fill in>@developer.gserviceaccount.com",
"client_id": "<please fill in>.apps.googleusercontent.com",
"type": "service_account"
});
var scopes = [...];
var client = http.Client();
AccessCredentials credentials =
await obtainAccessCredentialsViaServiceAccount(accountCredentials, scopes, client);
client.close();
return credentials;
}
或者通过以下方法获取已验证的HTTP客户端:
import "package:googleapis_auth/auth_io.dart";
// Use service account credentials to get an authenticated and auto refreshing client.
Future<AuthClient> obtainAuthenticatedClient() async {
final accountCredentials = ServiceAccountCredentials.fromJson({
"private_key_id": "<please fill in>",
"private_key": "<please fill in>",
"client_email": "<please fill in>@developer.gserviceaccount.com",
"client_id": "<please fill in>.apps.googleusercontent.com",
"type": "service_account"
});
var scopes = [...];
AuthClient client = await clientViaServiceAccount(accountCredentials, scopes);
return client; // Remember to close the client when you are finished with it.
}
自主应用程序/计算引擎使用元数据服务
如果应用程序希望自主运行并访问例如来自Google Cloud Project的数据,并且该应用程序正在ComputeEngine VM上运行,则可以使用服务账户。在这种情况下,可以通过元数据服务获取访问凭据。
import "package:googleapis_auth/auth_io.dart";
import "package:http/http.dart" as http;
// Use the metadata service to obtain oauth credentials.
Future<AccessCredentials> obtainCredentials() async {
var client = http.Client();
AccessCredentials credentials =
await obtainAccessCredentialsViaMetadataServer(client);
client.close();
return credentials;
}
或者通过以下方法获取已验证的HTTP客户端:
import "package:googleapis_auth/auth_io.dart";
// Use the metadata service to get an authenticated and auto refreshing client.
Future<AuthClient> obtainAuthenticatedClient() async {
AuthClient client = await clientViaMetadataServer();
return client; // Remember to close the client when you are finished with it.
}
使用API密钥访问公共数据
可以通过仅使用API密钥而无需OAuth2访问某些API。
import "package:googleapis_auth/auth_io.dart";
var client = clientViaApiKey('<api-key-from-devconsole>');
// [client] can now be used to make REST calls to Google APIs.
...
client.close();
更多信息
更多信息可以从官方Google Developers文档获得:
更多关于Flutter Google API认证插件googleapis_auth的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter Google API认证插件googleapis_auth的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个使用Flutter中的googleapis_auth
插件来进行Google API认证的示例代码。这个示例展示了如何使用OAuth 2.0进行设备认证,并获取Google Calendar API的访问令牌。
首先,确保在你的pubspec.yaml
文件中添加了googleapis_auth
和googleapis
依赖项:
dependencies:
flutter:
sdk: flutter
googleapis_auth: ^1.0.0 # 请检查最新版本号
googleapis: ^0.59.0 # 请检查最新版本号
然后运行flutter pub get
来安装这些依赖。
接下来,你需要创建一个Dart文件(例如auth.dart
),用于处理Google API的认证流程。
import 'package:flutter/material.dart';
import 'package:googleapis_auth/auth_browser.dart' as auth_browser;
import 'package:googleapis_auth/auth_io.dart' as auth_io;
import 'package:googleapis/calendar/v3.dart' as calendar;
// 替换为你的客户端ID和客户端密钥
const String clientId = 'YOUR_CLIENT_ID.apps.googleusercontent.com';
const String clientSecret = 'YOUR_CLIENT_SECRET';
const String redirectUri = 'urn:ietf:wg:oauth:2.0:oob';
const List<String> scopes = [calendar.CalendarApi.CalendarScope];
Future<String> getAccessToken() async {
// 检查是否在浏览器中运行
if (kIsWeb) {
// 使用浏览器认证
final AuthClientBrowser client = await auth_browser.authorize(
clientId: clientId,
scope: scopes,
redirectUri: Uri.parse(redirectUri),
);
// 获取访问令牌
final AccessCredentials credentials = await client.requestAccessCredentials();
return credentials.accessToken;
} else {
// 使用IO设备认证(如移动设备或桌面应用)
final AuthClientIO client = await auth_io.authorize(
clientId: clientId,
secret: clientSecret,
scope: scopes,
redirectUri: Uri.parse(redirectUri),
);
// 获取访问令牌
final AccessCredentials credentials = await client.requestAccessCredentials();
return credentials.accessToken;
}
}
Future<void> listEvents() async {
String accessToken = await getAccessToken();
// 使用Google Calendar API
final calendar.CalendarApi calendarApi = calendar.CalendarApi(
clientOptions: await auth_io.http.authorize(
clientId: clientId,
scopes: scopes,
accessToken: accessToken,
),
);
try {
final calendar.Events events = await calendarApi.events.list('primary');
if (events.items != null) {
for (calendar.Event event in events.items!) {
print('Event: ${event.summary}');
}
} else {
print('No upcoming events found.');
}
} catch (e) {
print('Error fetching events: $e');
}
}
void main() {
runApp(MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Google API Auth Demo')),
body: Center(
child: ElevatedButton(
onPressed: () async {
await listEvents();
},
child: Text('List Events'),
),
),
),
));
}
注意事项:
- OAuth 2.0凭证:确保你已经在Google Cloud Console中创建了OAuth 2.0客户端ID,并替换了
YOUR_CLIENT_ID
和YOUR_CLIENT_SECRET
。 - 重定向URI:对于Web应用,
urn:ietf:wg:oauth:2.0:oob
是一个常用的重定向URI,但对于移动和桌面应用,你可能需要配置一个特定的重定向URI,并在Google Cloud Console中注册它。 - 权限:确保你的Google Cloud项目已经启用了Google Calendar API,并且OAuth 2.0凭证拥有访问该API的权限。
- 依赖版本:检查
googleapis_auth
和googleapis
包的最新版本,并在pubspec.yaml
中更新它们。
这个示例代码展示了如何在Flutter应用中通过googleapis_auth
插件进行Google API认证,并调用Google Calendar API获取事件列表。希望这对你有所帮助!