認証はユーザーの身元を確認するプロセスで、通常はユーザー登録またはログインと呼ばれます。認可は、データまたはリソースへのアクセスを許可または拒否するプロセスです。たとえば、アプリがユーザーの Google ドライブにアクセスするためにユーザーの同意をリクエストします。
認証呼び出しと認可呼び出しは、アプリのニーズに基づいて 2 つの別個のフローにする必要があります。
アプリに Google API データを利用できる機能が含まれているが、アプリのコア機能として必須ではない場合は、API データにアクセスできない場合でも正常に処理できるようにアプリを設計する必要があります。たとえば、ユーザーがドライブへのアクセス権を付与していない場合は、最近保存したファイルのリストを非表示にできます。
Google API にアクセスするために必要なスコープへのアクセス権は、ユーザーが特定の API へのアクセスを必要とする操作を実行した場合にのみリクエストする必要があります。たとえば、ユーザーが [ドライブに保存] ボタンをタップするたびに、ユーザーのドライブにアクセスする権限をリクエストする必要があります。
認証と承認を分離することで、新規ユーザーの混乱を避け、特定の権限を求める理由についてユーザーが混乱するのを防ぐことができます。
認証には、Credential Manager API を使用することをおすすめします。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);
}
}