Xác thực xác định danh tính của một người và thường được gọi là đăng ký hoặc đăng nhập của người dùng. Uỷ quyền là quá trình cấp hoặc từ chối quyền truy cập vào dữ liệu hoặc tài nguyên. Ví dụ: ứng dụng của bạn yêu cầu người dùng đồng ý truy cập vào Google Drive của người dùng.
Lệnh gọi xác thực và uỷ quyền phải là hai luồng riêng biệt và khác nhau dựa trên nhu cầu của ứng dụng.
Nếu ứng dụng của bạn có các tính năng có thể sử dụng dữ liệu API của Google nhưng không bắt buộc phải là một phần của các tính năng cốt lõi của ứng dụng, thì bạn nên thiết kế ứng dụng của mình để có thể xử lý linh hoạt các trường hợp không truy cập được dữ liệu API. Ví dụ: bạn có thể ẩn danh sách các tệp đã lưu gần đây khi người dùng chưa cấp quyền truy cập vào Drive.
Bạn chỉ nên yêu cầu quyền truy cập vào các phạm vi mà bạn cần để truy cập vào API của Google khi người dùng thực hiện một hành động cần quyền truy cập vào một API cụ thể. Ví dụ: bạn nên yêu cầu quyền truy cập vào Drive của người dùng bất cứ khi nào người dùng nhấn vào nút "Lưu vào Drive".
Bằng cách tách biệt việc uỷ quyền với việc xác thực, bạn có thể tránh làm người dùng mới choáng ngợp hoặc khiến họ nhầm lẫn về lý do họ được yêu cầu cấp một số quyền nhất định.
Để xác thực, bạn nên sử dụng API Trình quản lý thông tin xác thực. Để uỷ quyền cho các hành động cần quyền truy cập vào dữ liệu người dùng do Google lưu trữ, bạn nên sử dụng AuthorizationClient.
Yêu cầu cấp quyền theo các hành động của người dùng
Bất cứ khi nào người dùng thực hiện một hành động cần thêm phạm vi, hãy gọi AuthorizationClient.authorize()
.
Ví dụ: nếu người dùng thực hiện một hành động cần quyền truy cập vào bộ nhớ của ứng dụng Drive, hãy làm như sau:
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));
Trong lệnh gọi lại onActivityResult
của hoạt động, bạn có thể kiểm tra xem các quyền cần thiết có được cấp hay không. Nếu có, hãy thực hiện hành động của người dùng.
@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);
}
}