身份验证可识别用户的身份,通常称为用户 注册或登录。授权是授予或拒绝访问权限的过程 数据或资源。例如,您的应用会请求用户同意 访问用户的 Google 云端硬盘。
身份验证和授权调用应分开且截然不同 根据网站或应用的需求调整投放流程
如果您的应用中的功能可以利用 Google API 数据, 是应用核心功能所不可或缺的一部分,那么您在设计应用时,应该 能够妥善处理无法访问 API 数据的情况。例如: 如果用户未授予云端硬盘访问权限,您可以隐藏最近保存的文件的列表 访问权限。
您应该请求访问仅需要访问 Google API 的范围的访问权限 当用户执行需要访问特定 API 的操作时触发。对于 例如,您应在每次 用户点按“保存到云端硬盘”按钮。
通过将授权与身份验证分开,您可以避免大量新 或让用户感到困惑 权限。
在 Google Identity Services 中,身份验证使用 SignInClient. 在授权需要访问 Google 存储的用户数据的操作时, 建议您使用 AuthorizationClient。
请求用户操作所需的权限
每当用户执行需要额外范围的操作时,调用
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);
}
}