Na tej stronie dowiesz się, jak utworzyć klucz przywracania, zalogować się za jego pomocą i go usunąć.
Zgodność wersji
Funkcja przywracania danych logowania w Credential Manager działa na urządzeniach z Androidem 9 lub nowszym, Usługami Google Play (GMS) w wersji 24220000 lub nowszej oraz biblioteką androidx.credentials w wersji 1.5.0 lub nowszej.
Wymagania wstępne
Skonfiguruj serwer strony ufającej podobny do serwera dla kluczy dostępu. Jeśli masz już serwer skonfigurowany do obsługi uwierzytelniania za pomocą kluczy dostępu, użyj tej samej implementacji po stronie serwera w przypadku kluczy przywracania.
Zależności
Dodaj te zależności do pliku build.gradle modułu aplikacji:
Kotlin
dependencies { implementation("androidx.credentials:credentials:1.7.0-alpha02") implementation("androidx.credentials:credentials-play-services-auth:1.7.0-alpha02") }
Groovy
dependencies { implementation "androidx.credentials:credentials:1.7.0-alpha02" implementation "androidx.credentials:credentials-play-services-auth:1.7.0-alpha02" }
Funkcja przywracania danych logowania jest dostępna w bibliotece androidx.credentials w wersji 1.5.0 lub nowszej. Zalecamy jednak, aby w miarę możliwości używać najnowszych stabilnych wersji zależności.
Przegląd
- Utwórz klucz przywracania: aby utworzyć klucz przywracania, wykonaj
te czynności:
- Utwórz instancję Credential Manager: utwórz obiekt
CredentialManager. - Pobierz opcje tworzenia danych logowania z serwera aplikacji: wyślij do aplikacji klienckiej szczegóły wymagane do utworzenia klucza przywracania z serwera aplikacji.
- Utwórz klucz przywracania: utwórz klucz przywracania na koncie użytkownika, jeśli użytkownik jest zalogowany w aplikacji.
- Obsłuż odpowiedź na utworzenie danych logowania: wyślij dane logowania z aplikacji klienckiej na serwer aplikacji w celu przetworzenia i obsłuż wszelkie wyjątki.
- Utwórz instancję Credential Manager: utwórz obiekt
- Zaloguj się za pomocą klucza przywracania: aby zalogować się za pomocą klucza przywracania,
wykonaj te czynności:
- Pobierz opcje pobierania danych logowania z serwera aplikacji: wyślij do aplikacji klienckiej szczegóły wymagane do pobrania klucza przywracania z serwera aplikacji.
- Pobierz klucz przywracania: gdy użytkownik skonfiguruje nowe urządzenie, poproś Credential Manager o klucz przywracania. Dzięki temu użytkownik może się zalogować bez dodatkowych danych.
- Obsłuż odpowiedź na pobranie danych logowania: wyślij klucz przywracania z aplikacji klienckiej na serwer aplikacji, aby zalogować użytkownika.
- Usuń klucz przywracania.
Tworzenie klucza przywracania
Aplikacja powinna obejmować wszystkie przypadki logowania się użytkownika, aby mieć pewność, że aktywni użytkownicy mają utworzony klucz przywracania. Utwórz klucz przywracania w tych sytuacjach:
- Jeśli użytkownik jest zalogowany, a klucz przywracania nie został jeszcze utworzony (np. w metodzie
onCreategłównegoActivity). - Gdy użytkownik się loguje lub rejestruje nowe konto.
Aby zoptymalizować wydajność i uniknąć obciążenia związanego z tworzeniem lub sprawdzaniem danych logowania przywracania przy każdym logowaniu, ustaw flagę boolean lub sygnaturę czasową utworzenia danych logowania w pamięci lokalnej, np. has_synced_restore_credential, aby śledzić, czy klucz został już utworzony.
Tworzenie instancji Credential Manager
Aby utworzyć instancję obiektu CredentialManager, użyj kontekstu aktywności aplikacji.
// Use your app or activity context to instantiate a client instance of
// CredentialManager.
private val credentialManager = CredentialManager.create(context)
Pobieranie opcji tworzenia danych logowania z serwera aplikacji
Użyj biblioteki zgodnej z FIDO na serwerze aplikacji, aby wysłać do aplikacji klienckiej informacje wymagane do utworzenia danych logowania przywracania, takie jak informacje o użytkowniku, aplikacji i dodatkowych właściwościach konfiguracji. Więcej informacji o implementacji po stronie serwera znajdziesz w przewodniku po stronie serwera.
Tworzenie klucza przywracania
Po przeanalizowaniu opcji tworzenia klucza publicznego wysłanych przez serwer utwórz
klucz przywracania, umieszczając te opcje w
CreateRestoreCredentialRequest obiekcie i wywołując
createCredential() metodę za pomocą CredentialManager obiektu.
// createRestoreRequest contains the details sent by the server
val response = credentialManager.createCredential(context, createRestoreRequest)
Najważniejsze informacje o kodzie
Obiekt
CreateRestoreCredentialRequestzawiera te pola:requestJson: opcje tworzenia danych logowania wysłane przez serwer aplikacji w formacie Web Authentication API dlaPublicKeyCredentialCreationOptionsJSON.isCloudBackupEnabled: poleBoolean, które określa, czy klucz przywracania ma być zapisywany w chmurze. Domyślnie ta flaga ma wartośćtrue. To pole ma te wartości:true(zalecane): ta wartość umożliwia zapisywanie kluczy przywracania w chmurze, jeśli użytkownik ma włączoną kopię zapasową Google i pełne szyfrowanie, np. blokadę ekranu.false: ta wartość zapisuje klucz lokalnie, a nie w chmurze. Jeśli użytkownik zdecyduje się na przywrócenie z chmury, klucz nie będzie dostępny na nowym urządzeniu.
Obsługa odpowiedzi na utworzenie danych logowania
Interfejs Credential Manager API zwraca odpowiedź typu
CreateRestoreCredentialResponse. Ta odpowiedź zawiera odpowiedź na rejestrację danych logowania klucza publicznego
w formacie JSON.
Wyślij klucz publiczny z aplikacji na serwer strony ufającej. Ten klucz publiczny jest podobny do klucza publicznego wygenerowanego podczas tworzenia klucza dostępu. Ten sam kod, który obsługuje tworzenie klucza dostępu na serwerze, może też obsługiwać tworzenie klucza przywracania. Więcej informacji o implementacji po stronie serwera znajdziesz w the przewodniku dotyczącym kluczy dostępu.
Podczas procesu tworzenia klucza przywracania obsłuż te wyjątki:
CreateRestoreCredentialDomException: ten wyjątek występuje, jeślirequestJsonjest nieprawidłowy i nie jest zgodny z formatem WebAuthn dlaPublicKeyCredentialCreationOptionsJSON.E2eeUnavailableException: ten wyjątek występuje, jeśliisCloudBackupEnabledma wartośćtrue, ale urządzenie użytkownika nie ma kopii zapasowej danych ani pełnego szyfrowania, np. blokady ekranu.
Aby mieć pewność, że dane logowania przywracania są tworzone we wszystkich przypadkach, musisz wyraźnie obsłużyć wyjątekE2eeUnavailableException, wywołując metodęcreateCredentialz wartościąisCloudBackupEnabledustawioną natrue. Jeśli zostanie zgłoszony wyjątekE2eeUnavailableException, przechwyć go i ponownie wywołaj metodęcreateCredentialz wartościąisCloudBackupEnabledustawioną nafalse.IllegalArgumentException: ten wyjątek występuje, jeślicreateRestoreRequestjest pusty lub nie jest prawidłowym formatem JSON albo jeśli nie ma prawidłowego polauser.idktóre jest zgodne ze specyfikacjami WebAuthn.
Logowanie się za pomocą klucza przywracania
Użyj funkcji przywracania danych logowania, aby automatycznie zalogować użytkownika podczas konfigurowania urządzenia.
Pobieranie opcji pobierania danych logowania z serwera aplikacji
Wyślij do aplikacji klienckiej opcje wymagane do pobrania klucza przywracania z serwera. Podobne wskazówki dotyczące kluczy dostępu na tym etapie znajdziesz w artykule Logowanie się za pomocą klucza dostępu. Więcej informacji o implementacji po stronie serwera znajdziesz w przewodniku po uwierzytelnianiu po stronie serwera.
Pobieranie klucza przywracania
Aby pobrać klucz przywracania na nowym urządzeniu, wywołaj metodę getCredential() na obiekcie CredentialManager.
Zalecamy pobieranie klucza przywracania w obu tych przypadkach:
- Przy pierwszym uruchomieniu aplikacji na urządzeniu. Przywracanie danych logowania w tym przypadku jest niezależne od przywracania danych aplikacji.
- Jeśli włączono zapisywanie i przywracanie danych aplikacji, pobierz klucz przywracania natychmiast po przywróceniu danych aplikacji. Użyj
BackupAgent, aby skonfigurować kopię zapasową aplikacji i upewnić się, że funkcjagetCredentialjest wykonywana w wywołaniu zwrotnymonRestoreFinished. Nie używaj metodyonRestore, ponieważ jest ona wywoływana tylko w przypadku kopii zapasowych par klucz-wartość, natomiastonRestoreFinishedjest wywoływana niezawodnie w przypadku przywracania dowolnego rodzaju kopii zapasowej. Pozwala to uniknąć potencjalnych opóźnień, gdy użytkownicy po raz pierwszy otwierają nowe urządzenie, i umożliwia im korzystanie z aplikacji bez czekania na jej otwarcie. Dzięki temu aplikacja może na przykład wysyłać użytkownikowi powiadomienia, zanim otworzy on aplikację po raz pierwszy na nowym urządzeniu, co jest szczególnie istotne w przypadku aplikacji do przesyłania wiadomości lub komunikacji.
// Fetch the options required to get the restore key
val authenticationJson = fetchAuthenticationJson()
// Create the GetRestoreCredentialRequest object
val options = GetRestoreCredentialOption(authenticationJson)
val getRequest = GetCredentialRequest(listOf(options))
val response = credentialManager.getCredential(context, getRequest)
// Type-check and extract the restore credential
val credential = response.credential as RestoreCredential
Interfejsy API Credential Manager zwracają odpowiedź typu
GetCredentialResponse. Dane logowania zawarte w tej odpowiedzi są wyraźnie typu RestoreCredential, który zawiera klucz publiczny.
Obsługa odpowiedzi na logowanie
Wyślij klucz publiczny z aplikacji na serwer strony ufającej, który może go użyć do zalogowania użytkownika. Po stronie serwera ta czynność jest podobna do logowania się za pomocą klucza dostępu. Ten sam kod, który obsługuje logowanie się za pomocą kluczy dostępu na serwerze, może też obsługiwać logowanie się za pomocą kluczy przywracania. Więcej informacji o implementacji po stronie serwera w przypadku kluczy dostępu znajdziesz w artykule Logowanie się za pomocą klucza dostępu.
Usuwanie klucza przywracania
Credential Manager jest bezstanowy i nie wie o aktywności użytkownika, więc nie usuwa automatycznie kluczy przywracania po ich użyciu. Aby usunąć klucz przywracania, wywołaj metodę clearCredentialState(). Ze względów bezpieczeństwa usuwaj klucz za każdym razem, gdy użytkownik się wylogowuje. Dzięki temu, gdy użytkownik następnym razem otworzy aplikację na tym samym urządzeniu, zostanie wylogowany i poproszony o ponowne zalogowanie się.
Odinstalowanie aplikacji jest interpretowane jako zamiar usunięcia odpowiedniego klucza przywracania z tego urządzenia, podobnie jak zamiar użytkownika podczas wylogowywania się.
Klucze przywracania są usuwane tylko w tych sytuacjach:
- Działania na poziomie systemu: użytkownicy odinstalowują aplikację lub czyszczą jej dane.
- Wywołania na poziomie aplikacji: programowo usuń klucz, wywołując metodę
clearCredentialState()podczas obsługi wylogowania użytkownika w kodzie aplikacji.
Gdy użytkownik wyloguje się z aplikacji, wywołaj metodę clearCredentialState() na obiekcie CredentialManager.
// Create a ClearCredentialStateRequest object
val clearRequest = ClearCredentialStateRequest(TYPE_CLEAR_RESTORE_CREDENTIAL)
// When the user logs out, delete the restore key
val response = credentialManager.clearCredentialState(clearRequest)