Jeśli obsługujesz logowanie się za pomocą kont Google, możesz korzystać z logowania jednym dotknięciem. który umożliwi użytkownikom bezproblemowe tworzenie kont nigdy nie wyjmują ich z kontekstu aplikacji.
Gdy wyświetlisz interfejs One Tap, użytkownicy zobaczą prośbę o utworzenie nowego konta za pomocą jednego z kont Google na urządzeniu. Jeśli użytkownik wybierze aby kontynuować, otrzymasz token tożsamości z podstawowymi informacjami imię i nazwisko, zdjęcie profilowe oraz zweryfikowany adres e-mail – których możesz użyć, utworzyć nowe konto.
Proces tworzenia konta jednym dotknięciem składa się z 2 etapów:
- Zintegrowanie klienta One Tap z aplikacją, co zostało opisane na tej stronie. Zasadniczo działa to tak samo jak logowanie jednym dotknięciem, ale występują pewne różnice konfiguracji.
- Dodanie do backendu możliwości tworzenia kont użytkowników na podstawie identyfikatora Google Zostało to omówione w artykule Używanie tokenów tożsamości w backendzie.
Gdzie mam korzystać z rejestracji jednym dotknięciem?
Najlepszym miejscem, w którym warto zaoferować użytkownikom rejestrację jednym dotknięciem, jest kontekst, zalogowanie się spowoduje włączenie nowych funkcji. Najpierw spróbuj zalogować użytkownika za pomocą zapisane dane logowania. Jeśli nie można znaleźć zapisanych danych logowania, zaproponuj utworzenie nowych dla użytkownika.
Zanim zaczniesz
Skonfiguruj projekt konsoli interfejsów API Google i projekt na Androida zgodnie z opisem w artykule Pierwsze kroki z logowaniem jednym dotknięciem.
1. Konfigurowanie klienta One Tap
Aby skonfigurować klienta jednym dotknięciem na potrzeby tworzenia konta, wykonaj te czynności:
- Nie włączaj żądań danych logowania. (Rejestracja jednym dotknięciem jest możliwa tylko uwierzytelnianie oparte na tokenach).
Włącz żądania tokenów identyfikatora Google za pomocą metod
setGoogleIdTokenRequestOptions()
i następujące ustawienia:- Ustaw identyfikator klienta serwera na identyfikator utworzony w interfejsach API Google konsola. Pamiętaj, że to identyfikator klienta serwera, a nie identyfikator identyfikator klienta Androida.
- skonfigurować w kliencie wszystkie konta Google na urządzeniu – jest filtrowane według autoryzowanych kont.
- Opcjonalnie możesz też poprosić o zweryfikowany numer telefonu, numer dla konta.
Java
public class YourActivity extends AppCompatActivity { // ... private SignInClient oneTapClient; private BeginSignInRequest signUpRequest; @Override public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) { super.onCreate(savedInstanceState, persistentState); oneTapClient = Identity.getSignInClient(this); signUpRequest = BeginSignInRequest.builder() .setGoogleIdTokenRequestOptions(GoogleIdTokenRequestOptions.builder() .setSupported(true) // Your server's client ID, not your Android client ID. .setServerClientId(getString(R.string.your_web_client_id)) // Show all accounts on the device. .setFilterByAuthorizedAccounts(false) .build()) .build(); // ... } }
Kotlin
class YourActivity : AppCompatActivity() { // ... private lateinit var oneTapClient: SignInClient private lateinit var signUpRequest: BeginSignInRequest override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) oneTapClient = Identity.getSignInClient(this) signUpRequest = BeginSignInRequest.builder() .setGoogleIdTokenRequestOptions( BeginSignInRequest.GoogleIdTokenRequestOptions.builder() .setSupported(true) // Your server's client ID, not your Android client ID. .setServerClientId(getString(R.string.your_web_client_id)) // Show all accounts on the device. .setFilterByAuthorizedAccounts(false) .build()) .build() // ... } // ... }
2. Śledzenie anulowania interfejsu jednym dotknięciem
Sprawdzaj, czy użytkownik odmówił już korzystania z jednego dotknięcia się zarejestrować, zamykając prompt lub dotykając go poza nim. Może to być jako właściwość logiczną aktywności. (Patrz: Wyłączanie wyświetlania przycisku jednym dotknięciem) UI).
3. Wyświetl interfejs rejestracji jednym dotknięciem
Jeśli użytkownik nie odmówił utworzenia nowego konta jednym dotknięciem, wywołaj metodę
metody beginSignIn()
obiektu klienta i dołącz detektory do Task
„powrót karetki”. Aplikacje zazwyczaj wykonują ten krok, gdy prośba o zalogowanie się jednym dotknięciem nie znajduje
wszystkich zapisanych danych logowania – czyli w detektorze błędów logowania.
użytkownika.
Klient One Tap zadzwoni do detektora sukcesu, jeśli użytkownik ma co najmniej jedną
konta Google skonfigurowane na urządzeniu; W detektorze sukcesu znajdź oczekujące
intencję z wyniku Task
i przekazać ją do startIntentSenderForResult()
do
uruchomić interfejs jednym dotknięciem.
Jeśli użytkownik nie ma na urządzeniu żadnych kont Google, klient One Tap wywoła detektor błędów. W takim przypadku nie musisz nic robić: możesz po prostu kontynuować prezentację aplikacji po wylogowaniu się, a użytkownik może zarejestrować się w normalny sposób.
Java
oneTapClient.beginSignIn(signUpRequest)
.addOnSuccessListener(this, new OnSuccessListener<BeginSignInResult>() {
@Override
public void onSuccess(BeginSignInResult result) {
try {
startIntentSenderForResult(
result.getPendingIntent().getIntentSender(), REQ_ONE_TAP,
null, 0, 0, 0);
} catch (IntentSender.SendIntentException e) {
Log.e(TAG, "Couldn't start One Tap UI: " + e.getLocalizedMessage());
}
}
})
.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// No Google Accounts found. Just continue presenting the signed-out UI.
Log.d(TAG, e.getLocalizedMessage());
}
});
Kotlin
oneTapClient.beginSignIn(signUpRequest)
.addOnSuccessListener(this) { result ->
try {
startIntentSenderForResult(
result.pendingIntent.intentSender, REQ_ONE_TAP,
null, 0, 0, 0)
} catch (e: IntentSender.SendIntentException) {
Log.e(TAG, "Couldn't start One Tap UI: ${e.localizedMessage}")
}
}
.addOnFailureListener(this) { e ->
// No Google Accounts found. Just continue presenting the signed-out UI.
Log.d(TAG, e.localizedMessage)
}
4. Obsługa odpowiedzi użytkownika
Odpowiedź użytkownika na prośbę o rejestrację jednym dotknięciem zostanie zgłoszona do aplikacji
za pomocą metody onActivityResult()
aktywności. Jeśli użytkownik utworzy
konta, wynikiem działania będzie token identyfikatora Google. Jeśli użytkownik odmówił rejestracji,
przez zamknięcie interfejsu jednym dotknięciem lub dotknięcie obszaru poza nim,
z kodem RESULT_CANCELED
. Aplikacja musi obsługiwać obie możliwości.
Utwórz konto za pomocą tokena identyfikatora Google
Jeśli użytkownik zarejestrował się za pomocą konta Google, możesz uzyskać token tożsamości
użytkownika, przekazując dane o zamiarach z aplikacji onActivityResult()
do usługi jednym dotknięciem
metody getSignInCredentialFromIntent()
klienta. Dokument będzie mieć
niepusta właściwość googleIdToken
.
Użyj tokena identyfikatora, aby utworzyć konto w backendzie (zobacz Uwierzytelniaj za pomocą za pomocą tokenów tożsamości) i zaloguj się.
Dane logowania zawierają też wszelkie dodatkowe informacje, o które prosisz, takie jak zweryfikowanego numeru telefonu konta (jeśli jest dostępny).
Java
public class YourActivity extends AppCompatActivity { // ... private static final int REQ_ONE_TAP = 2; // Can be any integer unique to the Activity. private boolean showOneTapUI = true; // ... @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case REQ_ONE_TAP: try { SignInCredential credential = oneTapClient.getSignInCredentialFromIntent(data); String idToken = credential.getGoogleIdToken(); if (idToken != null) { // Got an ID token from Google. Use it to authenticate // with your backend. Log.d(TAG, "Got ID token."); } } catch (ApiException e) { // ... } break; } } }
Kotlin
class YourActivity : AppCompatActivity() { // ... private val REQ_ONE_TAP = 2 // Can be any integer unique to the Activity private var showOneTapUI = true // ... override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) when (requestCode) { REQ_ONE_TAP -> { try { val credential = oneTapClient.getSignInCredentialFromIntent(data) val idToken = credential.googleIdToken when { idToken != null -> { // Got an ID token from Google. Use it to authenticate // with your backend. Log.d(TAG, "Got ID token.") } else -> { // Shouldn't happen. Log.d(TAG, "No ID token!") } } } catch (e: ApiException) { // ... } } } // ... }
Przestań wyświetlać interfejs jednym dotknięciem
Jeśli użytkownik odmówił zalogowania, połączenie z numerem getSignInCredentialFromIntent()
zwróci żądanie ApiException
z kodem stanu CommonStatusCodes.CANCELED
.
W takim przypadku należy tymczasowo zatrzymać wyświetlanie interfejsu logowania jednym dotknięciem
aby nie irytować użytkowników
wielokrotnymi prośbami. Przykład poniżej
Aby to zrobić, ustaw w aktywności właściwość, która służy do
określać, czy oferować użytkownikowi logowanie jednym dotknięciem; ale możesz też
zapisz wartość w funkcji SharedPreferences
lub użyj innej metody.
Ważne jest wdrożenie własnego ograniczenia liczby żądań logowania jednym dotknięciem. Jeśli tego nie zrobisz, a użytkownik anuluje kilka promptów z rzędu, nie wyświetla komunikatu przez następne 24 godziny.
Java
public class YourActivity extends AppCompatActivity { // ... private static final int REQ_ONE_TAP = 2; // Can be any integer unique to the Activity. private boolean showOneTapUI = true; // ... @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case REQ_ONE_TAP: try { // ... } catch (ApiException e) { switch (e.getStatusCode()) { case CommonStatusCodes.CANCELED: Log.d(TAG, "One-tap dialog was closed."); // Don't re-prompt the user. showOneTapUI = false; break; case CommonStatusCodes.NETWORK_ERROR: Log.d(TAG, "One-tap encountered a network error."); // Try again or just ignore. break; default: Log.d(TAG, "Couldn't get credential from result." + e.getLocalizedMessage()); break; } } break; } } }
Kotlin
class YourActivity : AppCompatActivity() { // ... private val REQ_ONE_TAP = 2 // Can be any integer unique to the Activity private var showOneTapUI = true // ... override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) when (requestCode) { REQ_ONE_TAP -> { try { // ... } catch (e: ApiException) { when (e.statusCode) { CommonStatusCodes.CANCELED -> { Log.d(TAG, "One-tap dialog was closed.") // Don't re-prompt the user. showOneTapUI = false } CommonStatusCodes.NETWORK_ERROR -> { Log.d(TAG, "One-tap encountered a network error.") // Try again or just ignore. } else -> { Log.d(TAG, "Couldn't get credential from result." + " (${e.localizedMessage})") } } } } } } // ... }
Dalsze kroki
Gdy użytkownik zakończy rejestrację jednym dotknięciem, otrzymasz token identyfikatora Google, zawiera podstawowe informacje profilowe: adres e-mail, imię i nazwisko użytkownika, i adres URL zdjęcia profilowego. W przypadku wielu aplikacji te informacje wystarczą, uwierzytelnić użytkownika w backendzie i utworzyć nowe konto.
Jeśli do utworzenia konta potrzebujesz dodatkowych informacji, na przykład datę urodzenia użytkownika – podaj szczegóły rejestracji, gdzie: o dodatkowe informacje. Następnie wyślij je do backendu, aby dokończyć tworzenie konta.