授予对 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”字段。当后端服务器与 Google 的身份验证服务进行通信时,此客户端 ID 将用于标识该服务器。
    1. 前往
    2. 点击创建客户端
    3. 选择 Web 应用类型。

声明依赖项

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

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() 方法来获取授权代码,然后将该授权代码发送到后端以换取访问令牌和刷新令牌。