認証はユーザーを識別するもので、一般にユーザーの登録またはログインと呼ばれます。承認は、データまたはリソースへのアクセスを許可または拒否するプロセスです。たとえば、アプリがユーザーの Google ドライブにアクセスすることについてユーザーの同意を求めます。
認証と認可の呼び出しは、サイトまたはアプリのニーズに基づいて、2 つの異なる個別のフローにする必要があります。
Google API データを活用できる機能がアプリにあるが、アプリのコア機能の一部として必要でない場合は、API データにアクセスできない場合に、ケースを適切に処理できるようにアプリを設計する必要があります。たとえば、ユーザーがドライブへのアクセスを許可していない場合、最近保存したファイルのリストを非表示にできます。
Google API にアクセスするために必要なスコープへのアクセスをリクエストする必要があるのは、特定の API へのアクセスを必要とする操作をユーザーが実行した場合のみです。たとえば、ユーザーが [ドライブに保存] ボタンをタップするたびに、ユーザーのドライブへのアクセス権限をリクエストする必要があります。
認可と認証を切り離すことで、新規ユーザーに過剰な負担をかけたり、特定の権限が必要な理由についてユーザーを混乱させたりすることを回避できます。
Google Identity Services では、SignInClient を使用して認証を行います。Google に保存されているユーザーデータへのアクセスを必要とするアクションを承認するには、AuthorizationClient を使用することをおすすめします。
ユーザー操作に必要な権限のリクエスト
ユーザーが追加のスコープを必要とするアクションを実行するたびに、AuthorizationClient.authorize()
を呼び出します。
たとえば、ドライブ アプリ ストレージへのアクセスを必要とする操作をユーザーが実行した場合は、次のようにします。
List<Scopes> requestedScopes = Arrays.asList(DriveScopes.DRIVE_APPDATA);
AuthorizationRequest authorizationRequest = AuthorizationRequest.builder().setRequestedScopes(requestedScopes).build();
Identity.getAuthorizationClient(this)
.authorize(builder.build())
.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);
}
}