Uwierzytelnianie służy do ustalania tożsamości użytkownika i jest powszechnie nazywane rejestracją lub logowaniem. Autoryzacja to proces przyznawania lub odmowy przyznania dostępu do danych lub zasobów. Na przykład aplikacja prosi użytkownika o zgodę na dostęp do jego Dysku Google.
Wywołania uwierzytelniania i autoryzacji powinny być 2 osobne i rozróżnione przepływy danych, które zależą od potrzeb aplikacji.
Jeśli Twoja aplikacja zawiera funkcje, które mogą korzystać z danych interfejsu Google API, ale nie są wymagane w ramach jej funkcji podstawowych, powinna być zaprojektowana tak, aby mogła sprawnie obsługiwać przypadki, gdy dane interfejsu API są niedostępne. Możesz na przykład ukryć listę ostatnio zapisanych plików, jeśli użytkownik nie ma dostępu do Dysku.
Dostęp do zakresów, których potrzebujesz, aby uzyskać dostęp do interfejsów API Google, powinieneś prosić tylko wtedy, gdy użytkownik wykona działanie wymagające dostępu do konkretnego interfejsu API. Na przykład, gdy użytkownik kliknie przycisk „Zapisz na Dysku”, powinieneś poprosić o dostęp do jego Dysku.
Oddzielając autoryzację od uwierzytelniania, możesz uniknąć przytłomienia nowych użytkowników lub wprowadzenia ich w błąd co do tego, dlaczego proszą o określone uprawnienia.
Do uwierzytelniania zalecamy użycie interfejsu Credential Manager API. Aby autoryzować działania, które wymagają dostępu do danych użytkownika przechowywanych przez Google, zalecamy użycie AuthorizationClient.
Konfigurowanie projektu
- Otwórz projekt w sekcji lub utwórz projekt, jeśli jeszcze go nie masz.
- Na stronie sprawdź, czy wszystkie informacje są kompletne i poprawne.
- Sprawdź, czy nazwa, logo i strona główna aplikacji są poprawne. Te wartości będą wyświetlane użytkownikom na ekranie zgody funkcji Zaloguj się przez Google podczas rejestracji oraz na ekranie Aplikacje i usługi innych firm.
- Sprawdź, czy adresy URL polityki prywatności i warunków korzystania z aplikacji są prawidłowe.
- W utwórz identyfikator klienta Androida dla swojej aplikacji, jeśli go jeszcze nie masz. Musisz podać nazwę pakietu aplikacji i podpis SHA-1.
- W utwórz nowy identyfikator klienta „Aplikacja internetowa”, jeśli jeszcze tego nie zrobiono. Pola „Authorized JavaScript origins” (Autoryzowane źródła JavaScriptu) i „Authorized redirect URIs” (Autoryzowane identyfikatory URI przekierowania) możesz na razie zignorować. Ten identyfikator klienta będzie używany do identyfikowania serwera zaplecza podczas komunikacji z usługami uwierzytelniania Google.
Deklarowanie zależności
W pliku build.gradle modułu zadeklaruj zależności, używając najnowszej wersji biblioteki Google Identity Services.
dependencies {
// ... other dependencies
implementation "com.google.android.gms:play-services-auth:<latest version>"
}
Prośby o uprawnienia wymagane przez działania użytkownika
Gdy użytkownik wykona działanie wymagające dodatkowego zakresu, wywołaj funkcję AuthorizationClient.authorize()
.
Jeśli na przykład użytkownik wykona działanie, które wymaga dostępu do miejsca na Dysku, wykonaj te czynności:
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));
W zgłoszeniu onActivityResult
możesz sprawdzić, czy udało się uzyskać wymagane uprawnienia, a jeśli tak, wykonać działanie użytkownika.
@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);
}
}
Jeśli korzystasz z interfejsów API Google po stronie serwera, możesz wywołać metodę getServerAuthCode() interfejsu AuthorizationResult, aby uzyskać kod autoryzacji, który wysyłasz do backendu w celu wymiany na token dostępu i odświeżania.