Android의 사용자 데이터에 대한 액세스 승인

인증은 사용자가 누구인지를 파악하며 일반적으로 사용자 가입 또는 로그인이라고 합니다. 승인은 데이터나 리소스에 대한 액세스 권한을 부여하거나 거부하는 프로세스입니다. 예를 들어, 앱이 사용자의 Google Drive에 액세스하기 위해 사용자의 동의를 요청합니다.

인증 및 승인 호출은 사이트 또는 앱의 요구사항에 따라 서로 다른 두 개의 서로 다른 흐름이어야 합니다.

앱에 Google API 데이터를 사용할 수 있지만 앱의 핵심 기능에 꼭 필요하지는 않은 기능이 있다면 API 데이터에 액세스할 수 없는 경우를 적절하게 처리할 수 있도록 앱을 설계해야 합니다. 예를 들어 사용자가 Drive 액세스 권한을 부여하지 않은 경우 최근에 저장된 파일 목록을 숨길 수 있습니다.

Google API에 액세스해야 하는 범위에 대한 액세스 권한은 사용자가 특정 API에 액세스해야 하는 작업을 실행할 때만 요청해야 합니다. 예를 들어 사용자가 'Drive에 저장' 버튼을 탭할 때마다 사용자의 Drive에 액세스할 수 있는 권한을 요청해야 합니다.

승인과 인증을 분리하면 신규 사용자에게 부담이 되거나 특정 권한을 요청하는 이유에 관해 사용자에게 혼동을 주지 않을 수 있습니다.

Google ID 서비스에서는 SignInClient를 사용하여 인증을 진행합니다. Google에서 저장한 사용자 데이터에 액세스해야 하는 작업을 승인하려면 AuthorizationClient를 사용하는 것이 좋습니다.

사용자 작업에 필요한 권한 요청

사용자가 추가 범위가 필요한 작업을 실행할 때마다 AuthorizationClient.authorize()를 호출합니다.

예를 들어 사용자가 Drive 앱 스토리지에 액세스해야 하는 작업을 실행한다면 다음을 실행합니다.

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));

활동의 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);
  }
}