授权访问 Google 用户数据

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

身份验证和授权调用应根据应用的需求分为两个独立且不同的流程。

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

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

通过将授权与身份验证分开,您可以避免让新用户感到不知所措,或使用户对为何被要求某些权限感到困惑。

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

设置您的 Google Cloud Console 项目

  1. Cloud Console 中打开您的项目,如果尚未创建项目,请创建一个。
  2. 品牌宣传页面上,确保所有信息完整且准确。
    1. 确保您的应用已指定正确的应用名称、应用徽标和应用主页。这些值将在注册时的“通过 Google 登录”同意屏幕和第三方应用与服务屏幕上向用户显示。
    2. 确保您已指定应用的隐私权政策和使用条款的网址。
  3. 客户端页面上,如果您的应用还没有 Android 客户端 ID,请创建一个。您需要指定应用的软件包名称和 SHA-1 签名。
    1. 转到客户端页面
    2. 点击 创建客户端
    3. 选择 Android 应用类型。
  4. 客户端页面上,如果您还没有“网络应用”客户端 ID,请创建一个新的。您现在可以忽略“授权的 JavaScript 来源”和“授权的重定向 URI”字段。当您的后端服务器与 Google 身份验证服务通信时,将使用此客户端 ID 来标识您的后端服务器。
    1. 转到客户端页面
    2. 点击 创建客户端
    3. 选择 网络应用 类型。

声明依赖项

在您模块的 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() 方法获取一个 auth code,您可以将其发送到您的后端以换取访问令牌和刷新令牌。