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

認証はユーザーの身元を確認するプロセスで、通常はユーザー登録またはログインと呼ばれます。認可は、データまたはリソースへのアクセスを許可または拒否するプロセスです。たとえば、アプリがユーザーの Google ドライブにアクセスするためにユーザーの同意をリクエストします。

認証呼び出しと認可呼び出しは、アプリのニーズに基づいて 2 つの別個のフローにする必要があります。

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

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

認証と承認を分離することで、新規ユーザーの混乱を避け、特定の権限を求める理由についてユーザーが混乱するのを防ぐことができます。

認証には、Credential Manager API を使用することをおすすめします。Google によって保存されているユーザーデータにアクセスする必要があるアクションを承認する場合は、AuthorizationClient の使用をおすすめします。

プロジェクトを設定する

  1. でプロジェクトを開きます。プロジェクトをまだ作成していない場合は、作成します。
  2. [] で、すべての情報が完全で正確であることを確認します。
    1. アプリに正しいアプリ名、アプリロゴ、アプリのホームページが割り当てられていることを確認します。これらの値は、登録時の [Google でログイン] の同意画面と [サードパーティ製のアプリとサービス] 画面でユーザーに表示されます。
    2. アプリのプライバシー ポリシーと利用規約の URL が指定されていることを確認します。
  3. で、アプリの Android クライアント ID を作成します(まだ作成していない場合)。アプリのパッケージ名と SHA-1 署名を指定する必要があります。
    1. に移動します。
    2. [Create client] をクリックします。
    3. アプリケーションの種類として [Android] を選択します。
  4. で、まだ作成していない場合は新しい「ウェブ アプリケーション」クライアント ID を作成します。現時点では、[承認済みの JavaScript 生成元] フィールドと [承認済みのリダイレクト URI] フィールドは無視できます。このクライアント ID は、バックエンド サーバーが Google の認証サービスと通信するときに、バックエンド サーバーを識別するために使用されます。
    1. に移動します。
    2. [Create client] をクリックします。
    3. [ウェブ アプリケーション] タイプを選択します。

依存関係の宣言

モジュールの build.gradle ファイルで、Google Identity Services ライブラリの最新バージョンを使用して依存関係を宣言します。

dependencies {
  // ... other dependencies

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

ユーザー操作に必要な権限をリクエストする

ユーザーが追加のスコープを必要とするアクションを実行するたびに、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);
  }
}

サーバーサイドで Google API にアクセスしている場合は、AuthorizationResult の getServerAuthCode() メソッドを呼び出して認証コードを取得し、バックエンドに送信してアクセス トークンと更新トークンと交換できます。