身份验证用于确定某人是谁,通常指用户注册或登录。授权是授予或拒绝访问数据或资源的过程。例如,您的应用请求用户同意访问其 Google 云端硬盘。
身份验证和授权调用应根据应用的需求分为两个独立且不同的流程。
如果您的应用具有可以使用 Google API 数据的功能,但这些功能并非应用核心功能的一部分,您应将应用设计为能够妥善处理 API 数据无法访问的情况。例如,当用户未授予云端硬盘访问权限时,您可以隐藏最近保存的文件列表。
您应仅在用户执行需要访问特定 API 的操作时,才请求访问访问 Google API 所需的范围。例如,每当用户点按“保存到云端硬盘”按钮时,您就应请求访问用户云端硬盘的权限。
通过将授权与身份验证分开,您可以避免让新用户感到不知所措,或使用户对为何被要求某些权限感到困惑。
对于身份验证,我们建议使用 Credential Manager API。对于需要访问 Google 存储的用户数据的授权操作,我们建议使用 AuthorizationClient。
设置您的 Google Cloud Console 项目
- 在 Cloud Console 中打开您的项目,如果尚未创建项目,请创建一个。
- 在品牌宣传页面上,确保所有信息完整且准确。
- 确保您的应用已指定正确的应用名称、应用徽标和应用主页。这些值将在注册时的“通过 Google 登录”同意屏幕和第三方应用与服务屏幕上向用户显示。
- 确保您已指定应用的隐私权政策和使用条款的网址。
- 在客户端页面上,如果您的应用还没有 Android 客户端 ID,请创建一个。您需要指定应用的软件包名称和 SHA-1 签名。
- 转到客户端页面。
- 点击 创建客户端。
- 选择 Android 应用类型。
- 在客户端页面上,如果您还没有“网络应用”客户端 ID,请创建一个新的。您现在可以忽略“授权的 JavaScript 来源”和“授权的重定向 URI”字段。当您的后端服务器与 Google 身份验证服务通信时,将使用此客户端 ID 来标识您的后端服务器。
- 转到客户端页面。
- 点击 创建客户端。
- 选择 网络应用 类型。
声明依赖项
在您模块的 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,您可以将其发送到您的后端以换取访问令牌和刷新令牌。