授予对 Google 用户数据的访问权限

身份验证用于确定用户的身份,通常称为用户注册或登录。授权是授予或拒绝访问数据或资源的过程。例如,您的应用请求用户同意访问用户的 Google 云端硬盘。

身份验证和授权调用应是两个单独且不同的流程,具体取决于应用的需求。

如果您的应用具有可以利用 Google API 数据的功能,但这些功能并非应用核心功能的一部分,您应将应用设计为能够妥善处理无法访问 API 数据的情况。例如,当用户未授予云端硬盘访问权限时,您可以隐藏最近保存的文件列表。

您应仅在用户执行需要访问特定 API 的操作时,才请求访问您需要访问 Google API 的作用域。例如,每当用户点按“保存到云端硬盘”按钮时,您都应请求访问用户云端硬盘的权限。

通过将授权与身份验证分开,您可以避免让新用户感到不知所措,或让用户对系统要求其提供某些权限的原因感到困惑。

对于身份验证,我们建议使用 Credential Manager API。对于需要访问 Google 存储的用户数据的授权操作,我们建议使用 AuthorizationClient

设置 项目

  1. 中打开您的项目,或者创建项目(如果您还没有项目)。
  2. 中,确保所有信息完整且准确无误。
    1. 确保您的应用已分配正确的应用名称、应用徽标和应用首页。这些值将在用户注册时显示在“使用 Google 账号登录”同意屏幕上,以及“第三方应用和服务”屏幕上。
    2. 请确保您已指定应用的隐私权政策和服务条款的网址。
  3. 中,为您的应用创建一个 Android 客户端 ID(如果您还没有)。您需要指定应用的软件包名称和 SHA-1 签名。
    1. 前往
    2. 点击创建客户端
    3. 选择 Android 应用类型。
  4. 中,创建一个新的“Web 应用”客户端 ID(如果您还没有)。您可以暂时忽略“已获授权的 JavaScript 来源”和“已获授权的重定向 URI”字段。此客户端 ID 将用于在您的后端服务器与 Google 的身份验证服务通信时标识该服务器。
    1. 前往
    2. 点击创建客户端
    3. 选择 Web 应用类型。

声明依赖项

在模块的 build.gradle 文件中,使用最新版 Google Identity Services 库声明依赖项。

dependencies {
  // ... other dependencies

  implementation "com.google.android.gms:play-services-auth:<latest version>"
}

请求用户操作所需的权限

每当用户执行需要额外范围的操作时,请调用 AuthorizationClient.authorize()

例如,如果用户执行的操作需要访问其云端硬盘应用存储空间,请执行以下操作:

List<Scopes> requestedScopes = Arrays.asList(DriveScopes.DRIVE_APPDATA);
AuthorizationRequest authorizationRequest = AuthorizationRequest.builder().setRequestedScopes(requestedScopes).build();
Identity.getAuthorizationClient(this)
        .authorize(authorizationRequest)
        .addOnSuccessListener(
            authorizationResult -> {
              if (authorizationResult.hasResolution()) {
                    // Access needs to be granted by the user
                PendingIntent pendingIntent = authorizationResult.getPendingIntent();
                try {
startIntentSenderForResult(pendingIntent.getIntentSender(),
REQUEST_AUTHORIZE, null, 0, 0, 0, null);
                } catch (IntentSender.SendIntentException e) {
                Log.e(TAG, "Couldn't start Authorization UI: " + e.getLocalizedMessage());
                }
              } else {
            // Access already granted, continue with user action
                saveToDriveAppFolder(authorizationResult);
              }
            })
        .addOnFailureListener(e -> Log.e(TAG, "Failed to authorize", e));

在 activity 的 onActivityResult 回调中,您可以检查是否已成功获取所需权限,如果已获取,则执行用户操作。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  if (requestCode == MainActivity.REQUEST_AUTHORIZE) {
    AuthorizationResult authorizationResult = Identity.getAuthorizationClient(this).getAuthorizationResultFromIntent(data);
    saveToDriveAppFolder(authorizationResult);
  }
}

如果您要在服务器端访问 Google API,可以调用 AuthorizationResult 的 getServerAuthCode() 方法来获取授权代码,然后将该代码发送到后端以换取访问令牌和刷新令牌。