Flutter Google API认证插件googleapis_auth的使用

发布于 1周前 作者 wuwangju 来自 Flutter

Flutter Google API认证插件googleapis_auth的使用

注意事项

注意: 不要在Flutter应用中直接使用package:googleapis_auth。请改用extension_google_sign_in_as_googleapis_auth包。

使用此包

使用googleapis_auth包需要创建一个Google Cloud Project并为特定的应用程序类型获取应用程序凭据。所需步骤如下:

  1. Google Developers Console上创建一个新的Google Cloud Project。
  2. Google Developers Console上启用应用程序将要使用的所有API(在DevConsole -> Project -> APIs & auth -> APIs下)。
  3. Google Developers Console上为特定的应用程序类型获取应用程序凭据(在DevConsole -> Project -> APIs & auth -> Credentials下)。
  4. 使用googleapis_auth包来获取访问凭据或获取已验证的HTTP客户端。

根据应用程序类型,有不同方式实现第三步和第四步。以下是支持的OAuth2流程列表及其描述。

客户端Web应用程序

对于仅限客户端的Web应用程序,需要创建一个“Client ID”(在DevConsole -> Project -> APIs & auth -> Credentials下)。创建新的Client ID时,选择“Web application”类型。对于仅限客户端的应用程序,不需要设置Redirect URIsJavascript 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();
  }
}

为了防止弹出窗口阻止程序阻止用户授权对话框,最好只在事件处理程序内部调用obtainAccessCredentialsViaUserConsentclientViaUserConsent方法,因为大多数浏览器不会阻止响应用户交互创建的弹出窗口。

已安装/控制台应用程序

对于已安装/控制台应用程序,需要创建一个“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

1 回复

更多关于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_authgoogleapis依赖项:

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'),
        ),
      ),
    ),
  ));
}

注意事项:

  1. OAuth 2.0凭证:确保你已经在Google Cloud Console中创建了OAuth 2.0客户端ID,并替换了YOUR_CLIENT_IDYOUR_CLIENT_SECRET
  2. 重定向URI:对于Web应用,urn:ietf:wg:oauth:2.0:oob是一个常用的重定向URI,但对于移动和桌面应用,你可能需要配置一个特定的重定向URI,并在Google Cloud Console中注册它。
  3. 权限:确保你的Google Cloud项目已经启用了Google Calendar API,并且OAuth 2.0凭证拥有访问该API的权限。
  4. 依赖版本:检查googleapis_authgoogleapis包的最新版本,并在pubspec.yaml中更新它们。

这个示例代码展示了如何在Flutter应用中通过googleapis_auth插件进行Google API认证,并调用Google Calendar API获取事件列表。希望这对你有所帮助!

回到顶部