Функция «Вход через связанный аккаунт» позволяет пользователям, у которых уже есть привязанный к вашему сервису аккаунт Google , войти в систему одним касанием . Это улучшает пользовательский опыт, поскольку они могут войти в систему одним щелчком, не вводя повторно имя пользователя и пароль. Это также снижает вероятность создания пользователями дублирующих аккаунтов в вашем сервисе.
Функция входа через связанный аккаунт доступна в рамках процесса входа в одно касание для Android. Это означает, что вам не нужно импортировать отдельную библиотеку, если в вашем приложении уже включена функция входа в одно касание.
В этом документе вы узнаете, как модифицировать ваше Android-приложение для поддержки входа в систему с помощью связанных учетных записей.
Как это работает
- Вы сами выбираете отображение связанных учетных записей в процессе входа в систему одним касанием.
- Если пользователь авторизован в Google и связал свою учетную запись Google со своей учетной записью в вашем сервисе, ему будет возвращен идентификационный токен для связанной учетной записи.
- Пользователю отображается запрос на вход в систему одним касанием с возможностью авторизации с помощью привязанной учетной записи.
- Если пользователь решит продолжить использование связанной учетной записи, токен идентификации пользователя будет возвращен в ваше приложение. Вы сопоставляете его с токеном, отправленным на ваш сервер на шаге 2, чтобы идентифицировать вошедшего в систему пользователя.
Настраивать
Настройте среду разработки.
Установите новейшие сервисы Google Play на свой сервер разработки:
- Откройте менеджер Android SDK .
В разделе «Инструменты SDK» найдите «Сервисы Google Play» .
Если статус этих пакетов не «Установлено», выберите оба пакета и нажмите «Установить пакеты» .
Настройте свое приложение
В файле
build.gradleна уровне проекта добавьте репозиторий Maven от Google как в разделbuildscript, так и в разделallprojects.buildscript { repositories { google() } } allprojects { repositories { google() } }Добавьте зависимости для API "Link with Google" в файл gradle вашего модуля, обычно это
app/build.gradle:dependencies { implementation 'com.google.android.gms:play-services-auth:21.3.0' }
Измените свое Android-приложение для поддержки входа в систему с помощью связанных учетных записей.
В конце процесса входа в систему с использованием связанной учетной записи вашему приложению возвращается идентификационный токен. Перед авторизацией пользователя необходимо проверить целостность идентификационного токена.
В приведенном ниже примере кода подробно описаны шаги по получению, проверке идентификационного токена и последующему входу пользователя в систему.
Создайте действие, которое будет получать результат выполнения интента «Вход в систему».
Котлин
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") } });Сформируйте запрос на вход в систему.
Котлин
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()Запустить интент "Ожидание входа в систему"
Котлин
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); });
Проверьте целостность токена идентификации.
Используйте клиентскую библиотеку Google API.
Использование Java-библиотеки Google API Client Library — рекомендуемый способ проверки токенов Google ID в производственной среде.
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.");
}
Метод GoogleIdTokenVerifier.verify() проверяет подпись JWT, утверждение aud , утверждение iss и утверждение them exp .
Если вам необходимо убедиться, что токен ID представляет собой учетную запись организации Google Workspace или Cloud, вы можете проверить утверждение hd , сравнив доменное имя, возвращаемое методом Payload.getHostedDomain() .