Android でユーザーデータへのアクセスを承認する

認証はユーザーが誰であるかを確立するものであり、一般にユーザーの登録またはログインと呼ばれます。認可は、データまたはリソースへのアクセスを許可または拒否するプロセスです。たとえば、アプリがユーザーの Google ドライブにアクセスすることについてユーザーの同意を求めるとします。

認証と認可の呼び出しは、サイトまたはアプリのニーズに応じて、2 つの異なる異なるフローにする必要があります。

Google API データを利用できる機能がアプリにあるが、アプリのコア機能の一部として必要でない場合は、API データにアクセスできない場合にケースを適切に処理できるようにアプリを設計する必要があります。たとえば、ユーザーがドライブへのアクセスを許可していない場合は、最近保存したファイルのリストを非表示にできます。

Google API にアクセスするために必要なスコープへのアクセスをリクエストする必要があるのは、特定の API へのアクセスを必要とする操作をユーザーが実行した場合に限られます。たとえば、ユーザーが [ドライブに保存] ボタンをタップするたびに、ユーザーのドライブへのアクセス権限をリクエストする必要があります。

認可と認証を分離することで、新規ユーザーに過剰な負担をかけたり、特定の権限が必要な理由についてユーザーを混乱させたりすることを回避できます。

Google ID サービスでは、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));

アクティビティの 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);
  }
}