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

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

인증 및 승인 호출은 앱의 요구사항에 따라 서로 구분되는 두 가지 흐름이어야 합니다.

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

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

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

인증에는 Credential Manager API를 사용하는 것이 좋습니다. Google에서 저장한 사용자 데이터에 액세스해야 하는 작업을 승인하려면 AuthorizationClient를 사용하는 것이 좋습니다.

프로젝트 설정하기

  1. 에서 프로젝트를 열거나 아직 프로젝트가 없는 경우 프로젝트를 만듭니다.
  2. 에서 모든 정보가 완전하고 정확한지 확인합니다.
    1. 앱에 올바른 앱 이름, 앱 로고, 앱 홈페이지가 할당되어 있는지 확인합니다. 이러한 값은 가입 시 Google 계정으로 로그인 동의 화면과 서드 파티 앱 및 서비스 화면에 사용자에게 표시됩니다.
    2. 앱의 개인정보처리방침 및 서비스 약관 URL을 지정했는지 확인합니다.
  3. 에서 앱의 Android 클라이언트 ID를 만듭니다(아직 없는 경우). 앱의 패키지 이름과 SHA-1 서명을 지정해야 합니다.
    1. 로 이동합니다.
    2. 클라이언트 만들기를 클릭합니다.
    3. Android 애플리케이션 유형을 선택합니다.
  4. 에서 아직 만들지 않았다면 새 '웹 애플리케이션' 클라이언트 ID를 만듭니다. 지금은 '승인된 JavaScript 출처' 및 '승인된 리디렉션 URI' 필드를 무시해도 됩니다. 이 클라이언트 ID는 백엔드 서버가 Google의 인증 서비스와 통신할 때 백엔드 서버를 식별하는 데 사용됩니다.
    1. 로 이동합니다.
    2. 클라이언트 만들기를 클릭합니다.
    3. 웹 애플리케이션 유형을 선택합니다.

종속 항목 선언

모듈의 build.gradle 파일에서 Google ID 서비스 라이브러리의 최신 버전을 사용하여 종속 항목을 선언합니다.

dependencies {
  // ... other dependencies

  implementation "com.google.android.gms:play-services-auth:<latest version>"
}

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

사용자가 추가 범위가 필요한 작업을 실행할 때마다 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);
  }
}

서버 측에서 Google API에 액세스하는 경우 AuthorizationResult의 getServerAuthCode() 메서드를 호출하여 인증 코드를 가져와 백엔드로 전송하여 액세스 및 갱신 토큰으로 교환할 수 있습니다.