Uỷ quyền truy cập vào dữ liệu người dùng

Xác thực thiết lập danh tính của một người và thường được gọi là hoạt động đă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 sự đồng ý của người dùng để truy cập vào Google Drive của họ.

Các lệnh gọi xác thực và uỷ quyền phải là hai luồng riêng biệt và riêng biệt dựa trên nhu cầu của trang web hoặc ứng dụng.

Nếu ứng dụng của bạn có các tính năng có thể tận dụng dữ liệu API của Google nhưng không bắt buộc như một phần trong 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ó thể xử lý linh hoạt các trường hợp khi không thể truy cập vào 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 những phạm vi mà bạn cần truy cập vào các API của Google khi người dùng thực hiện một thao tác yêu cầu quyền truy cập vào một API cụ thể. Ví dụ: bạn nên yêu cầu cấp quyền truy cập vào Drive của người dùng mỗi khi người dùng nhấn vào nút "Lưu vào Drive".

Bằng cách tách biệt uỷ quyền khỏi quy trình xác thực, bạn có thể tránh làm người dùng mới bị choáng ngợp hoặc khiến người dùng nhầm lẫn về lý do họ được yêu cầu cấp một số quyền nhất định.

Trong Dịch vụ danh tính của Google, việc xác thực được thực hiện bằng cách sử dụng SignInClient. Để 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 AuthorizeClient.

Yêu cầu quyền do hành động của người dùng yêu cầu

Bất cứ khi nào người dùng thực hiện một thao tác yêu cầu phạm vi bổ sung, hãy gọi AuthorizationClient.authorize().

Ví dụ: nếu người dùng thực hiện một hành động yêu cầu quyền truy cập vào bộ nhớ ứ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(builder.build())
        .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 lấy thành công hay chưa và nếu đã có, hãy thực hiện thao tác 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);
  }
}