Logowanie się na połączone konto umożliwia użytkownikom logowanie się jednym dotknięciem przez Google którzy mają już swoje konto Google połączone z Twoją usługą. Dzięki temu użytkownicy mogą logować się 1 kliknięciem, bez konieczności ponownego nazwę użytkownika i hasło. Zmniejsza też ryzyko tworzenia zduplikowanych kont w usłudze.
Logowanie na połączone konto jest dostępne w ramach logowania jednym dotknięciem na na urządzeniu z Androidem. Oznacza to, że nie musisz importować osobnej biblioteki, jeśli aplikacja ma już włączoną funkcję jednego dotknięcia.
Z tego dokumentu dowiesz się, jak zmodyfikować aplikację na Androida, aby obsługiwała Logowanie na połączone konto.
Jak to działa
- Wyrażasz zgodę na wyświetlanie połączonych kont podczas logowania jednym dotknięciem.
- Jeśli użytkownik jest zalogowany w Google i połączył swoje konto Google z w usłudze, dla połączonego konta zostanie zwrócony token tożsamości koncie.
- Użytkownik zobaczy prośbę o zalogowanie się jednym dotknięciem z opcją zalogowania się za pomocą połączonego konta.
- Jeśli użytkownik zdecyduje się kontynuować korzystanie z połączonego konta, token identyfikatora użytkownika w Twojej aplikacji. Udało Ci się dopasować ten token do tokena, który został wysłany na serwera w kroku 2, aby zidentyfikować zalogowanego użytkownika.
Konfiguracja
Konfigurowanie środowiska programistycznego
Pobierz najnowsze Usługi Google Play na hoście programisty:
- Otwórz aplikację Menedżer pakietów SDK na Androida
W sekcji Narzędzia SDK znajdź Usługi Google Play.
Jeśli stan tych pakietów to nie Zainstalowano, wybierz je i kliknij Zainstaluj pakiety.
Konfiguracja aplikacji
W pliku
build.gradle
na poziomie projektu uwzględnij repozytorium Google Maven w sekcjachbuildscript
iallprojects
.buildscript { repositories { google() } } allprojects { repositories { google() } }
Dodaj zależności opcji „Połącz z Google” do modułu plik Gradle na poziomie aplikacji, którym jest zwykle
app/build.gradle
:dependencies { implementation 'com.google.android.gms:play-services-auth:21.2.0' }
Modyfikowanie aplikacji na Androida w celu obsługi logowania na połączone konto
Po zakończeniu procesu logowania na połączone konto na konto zostanie zwrócony token tożsamości. . Przed zalogowaniem użytkownika należy sprawdzić integralność tokena identyfikatora.
W przykładowym kodzie poniżej znajdziesz szczegółowe instrukcje pobierania danych, zweryfikować token tożsamości, a następnie zaloguje użytkownika.
Utwórz działanie, aby otrzymać wynik intencji logowania
Kotlin
private val activityResultLauncher = registerForActivityResult( ActivityResultContracts.StartIntentSenderForResult()) { result -> if (result.resultCode == RESULT_OK) { try { val signInCredentials = Identity.signInClient(this) .signInCredentialFromIntent(result.data) // Review the Verify the integrity of the ID token section for // details on how to verify the ID token verifyIdToken(signInCredential.googleIdToken) } catch (e: ApiException) { Log.e(TAG, "Sign-in failed with error code:", e) } } else { Log.e(TAG, "Sign-in failed") } }
Java
private final ActivityResultLauncher<IntentSenderResult> activityResultLauncher = registerForActivityResult( new ActivityResultContracts.StartIntentSenderForResult(), result -> { If (result.getResultCode() == RESULT_OK) { try { SignInCredential signInCredential = Identity.getSignInClient(this) .getSignInCredentialFromIntent(result.getData()); verifyIdToken(signInCredential.getGoogleIdToken()); } catch (e: ApiException ) { Log.e(TAG, "Sign-in failed with error:", e) } } else { Log.e(TAG, "Sign-in failed") } });
Tworzenie żądania logowania
Kotlin
private val tokenRequestOptions = GoogleIdTokenRequestOptions.Builder() .supported(true) // Your server's client ID, not your Android client ID. .serverClientId(getString("your-server-client-id") .filterByAuthorizedAccounts(true) .associateLinkedAccounts("service-id-of-and-defined-by-developer", scopes) .build()
Java
private final GoogleIdTokenRequestOptions tokenRequestOptions = GoogleIdTokenRequestOptions.Builder() .setSupported(true) .setServerClientId("your-service-client-id") .setFilterByAuthorizedAccounts(true) .associateLinkedAccounts("service-id-of-and-defined-by-developer", scopes) .build()
Uruchamianie intencji oczekującej na logowanie
Kotlin
Identity.signInClient(this) .beginSignIn( BeginSignInRequest.Builder() .googleIdTokenRequestOptions(tokenRequestOptions) .build()) .addOnSuccessListener{result -> activityResultLauncher.launch(result.pendingIntent.intentSender) } .addOnFailureListener {e -> Log.e(TAG, "Sign-in failed because:", e) }
Java
Identity.getSignInClient(this) .beginSignIn( BeginSignInRequest.Builder() .setGoogleIdTokenRequestOptions(tokenRequestOptions) .build()) .addOnSuccessListener(result -> { activityResultLauncher.launch( result.getPendingIntent().getIntentSender()); }) .addOnFailureListener(e -> { Log.e(TAG, "Sign-in failed because:", e); });
Sprawdzanie integralności tokena tożsamości
Aby potwierdzić poprawność tokena, upewnij się, że: są spełnione kryteria:
- Token tożsamości jest prawidłowo podpisany przez Google. Używanie kluczy publicznych Google
(dostępny w
JWK lub
PEM)
aby zweryfikować podpis tokena. Klucze te są regularnie poddawane rotacji, badanie
nagłówka
Cache-Control
w odpowiedzi, aby określić, kiedy pobierz je ponownie. - Wartość
aud
w tokenie identyfikatora jest równa jednej z wartości identyfikatorów klientów. Jest to konieczne, aby zapobiec tokenom tożsamości wydanym złośliwemu hakerowi w celu uzyskania dostępu do danych tego samego użytkownika na serwerze backendu aplikacji. - Wartość
iss
w tokenie identyfikatora jest równaaccounts.google.com
lubhttps://accounts.google.com
. - Nie upłynął czas ważności (
exp
) tokena identyfikatora. - Jeśli chcesz sprawdzić, czy token identyfikatora reprezentuje Google Workspace lub Cloud
konta organizacji, możesz sprawdzić twierdzenie
hd
, które wskazuje, w domenie użytkownika. Tej opcji należy używać, gdy dostęp do zasobu mają tylko użytkownicy należący do określonych domen. Brak tego roszczenia oznacza, że konto nie należy do Domena hostowana przez Google.
Za pomocą pól email
, email_verified
i hd
możesz określić, czy
Google hostuje dany adres e-mail i jest dla niego autorytatywny. W przypadkach, w których autorytatywny jest Google,
czy użytkownik jest znany jako faktyczny właściciel konta, więc możesz pominąć hasło lub inne
a także metody testów.
Przypadki, w których Google ma wiarygodność:
- To jest konto Gmail, adres
email
ma sufiks@gmail.com
. - To jest konto G Suite,
email_verified
ma wartość prawda i ustawionohd
.
Użytkownicy mogą rejestrować się w Google, nie korzystając z Gmaila lub G Suite. Kiedy
email
nie zawiera sufiksu @gmail.com
, a hd
nie występuje, Google nie
zalecamy wiarygodność i hasło lub inne metody weryfikujące weryfikację
użytkownika. email_verified
może również być prawdziwe, ponieważ początkowo firma Google zweryfikowała
użytkownika przy tworzeniu konta Google, jednak własność firmy zewnętrznej
konto e-mail mogło się od tego czasu zmienić.
Zamiast pisać własny kod do wykonania tych czynności weryfikacyjnych, zalecamy,
zalecamy korzystanie z biblioteki klienta interfejsów API Google na swojej platformie lub do ogólnego przeznaczenia,
Biblioteka JWT. Do programowania i debugowania możesz używać wywołania naszego tokeninfo
punktu końcowego weryfikacji.
Używanie biblioteki klienta interfejsów API Google
Korzystanie z Biblioteka klienta interfejsu Java Google API to zalecany sposób weryfikacji tokenów tożsamości Google w środowisku produkcyjnym.
Java
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken.Payload;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;
...
GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
// Specify the CLIENT_ID of the app that accesses the backend:
.setAudience(Collections.singletonList(CLIENT_ID))
// Or, if multiple clients access the backend:
//.setAudience(Arrays.asList(CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3))
.build();
// (Receive idTokenString by HTTPS POST)
GoogleIdToken idToken = verifier.verify(idTokenString);
if (idToken != null) {
Payload payload = idToken.getPayload();
// Print user identifier
String userId = payload.getSubject();
System.out.println("User ID: " + userId);
// Get profile information from payload
String email = payload.getEmail();
boolean emailVerified = Boolean.valueOf(payload.getEmailVerified());
String name = (String) payload.get("name");
String pictureUrl = (String) payload.get("picture");
String locale = (String) payload.get("locale");
String familyName = (String) payload.get("family_name");
String givenName = (String) payload.get("given_name");
// Use or store profile information
// ...
} else {
System.out.println("Invalid ID token.");
}
Metoda GoogleIdTokenVerifier.verify()
weryfikuje podpis JWT,
roszczenia: aud
, iss
i exp
.
Jeśli chcesz sprawdzić, czy token identyfikatora reprezentuje Google Workspace lub Cloud
konta organizacji, możesz zweryfikować własność domeny hd
, sprawdzając nazwę domeny
zwracanymi przez metodę Payload.getHostedDomain()
.
Wywołanie punktu końcowego tokeninfo
Aby w prosty sposób sprawdzić podpis tokena identyfikatora na potrzeby debugowania, wykonaj te czynności:
użyj punktu końcowego tokeninfo
. Wywołanie tego punktu końcowego wymaga:
dodatkowe żądanie sieciowe, które wykonuje większość weryfikacji za Ciebie podczas testowania prawidłowych;
weryfikacji i wyodrębniania ładunku w ramach własnego kodu. Nie nadaje się do użytku w środowisku produkcyjnym
ponieważ żądania mogą być ograniczane lub w inny sposób powodować sporadyczne błędy.
Aby zweryfikować token tożsamości za pomocą punktu końcowego tokeninfo
, utwórz protokół HTTPS
POST lub GET do punktu końcowego i przekaż swój token tożsamości w polu
id_token
.
Aby na przykład zweryfikować token „XYZ123”, wyślij to żądanie GET:
https://oauth2.googleapis.com/tokeninfo?id_token=XYZ123
Jeśli token jest prawidłowo podpisany, a iss
i exp
ma oczekiwane wartości, otrzymasz odpowiedź HTTP 200, gdzie treść
zawiera deklaracje tokena identyfikatora w formacie JSON.
Oto przykładowa odpowiedź:
{ // These six fields are included in all Google ID Tokens. "iss": "https://accounts.google.com", "sub": "110169484474386276334", "azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com", "aud": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com", "iat": "1433978353", "exp": "1433981953", // These seven fields are only included when the user has granted the "profile" and // "email" OAuth scopes to the application. "email": "testuser@gmail.com", "email_verified": "true", "name" : "Test User", "picture": "https://lh4.googleusercontent.com/-kYgzyAWpZzJ/ABCDEFGHI/AAAJKLMNOP/tIXL9Ir44LE/s99-c/photo.jpg", "given_name": "Test", "family_name": "User", "locale": "en" }
Jeśli chcesz potwierdzić, że token identyfikatora reprezentuje konto Google Workspace, możesz to sprawdzić
twierdzenie hd
, które wskazuje hostowaną domenę użytkownika; Tej opcji należy użyć, gdy
ograniczanie dostępu do zasobu wyłącznie członkom określonych domen. Brak tego roszczenia
wskazuje, że konto nie należy do domeny hostowanej w Google Workspace.