Utilice el cliente de inicio de sesión de One Tap para solicitar permiso al usuario para recuperar una de las credenciales que utilizó anteriormente para iniciar sesión en su aplicación. Estas credenciales pueden ser una cuenta de Google o una combinación de nombre de usuario y contraseña que guardaron con Google usando Chrome, Autocompletar Android o Smart Lock para contraseñas.
Cuando las credenciales se recuperan correctamente, puede usarlas para iniciar sesión sin problemas con el usuario en su aplicación.
Si el usuario no ha guardado ninguna credencial, no se presenta la interfaz de usuario y puede proporcionar su experiencia normal de desconexión.
¿Dónde debo usar el inicio de sesión de One Tap?
Si su aplicación requiere que los usuarios inicien sesión, muestre la interfaz de usuario de One Tap en su pantalla de inicio de sesión. Esto puede ser útil incluso si ya tiene un botón "Iniciar sesión con Google": debido a que la interfaz de usuario de One Tap se puede configurar para mostrar solo las credenciales que el usuario utilizó anteriormente para iniciar sesión, puede ser un recordatorio para los usuarios que inician sesión con poca frecuencia. cómo iniciaron sesión la última vez y evitar que creen nuevas cuentas accidentalmente con su aplicación.
Si el inicio de sesión es opcional para su aplicación, considere usar el inicio de sesión con un toque en cualquier pantalla que tenga una experiencia mejorada al iniciar sesión. Por ejemplo, si los usuarios pueden explorar contenido con su aplicación mientras están desconectados, pero solo pueden publicar comentarios o agregar artículos a un carrito de compras después de iniciar sesión, ese sería un contexto sensato para iniciar sesión con One Tap.
Las aplicaciones opcionales de inicio de sesión también deben usar el inicio de sesión One Tap en sus pantallas de inicio de sesión, por los motivos indicados anteriormente.
Antes de que empieces
- Configurar el proyecto de la consola API de Google y Android proyecto como se describe en Comience con un toque de inicio de sesión .
- Si usted apoya basada en contraseña de inicio de sesión, optimizar su aplicación para el relleno automático (o utilizar Smart Lock para contraseñas) para que los usuarios pueden guardar sus credenciales de la contraseña después de iniciar sesión.
1. Configure el cliente de inicio de sesión de One Tap
Puede configurar el cliente de inicio de sesión One Tap para que los usuarios inicien sesión con contraseñas guardadas, cuentas de Google guardadas o cualquiera de las dos. (Se recomienda admitir ambos, para permitir la creación de cuentas con un toque para nuevos usuarios y el inicio de sesión automático o con un toque para tantos usuarios recurrentes como sea posible).
Si sus usos de aplicaciones de inicio de sesión basada en contraseña, uso setPasswordRequestOptions()
para permitir solicitudes de credenciales de contraseña.
Si su aplicación utiliza Google inicio de sesión, el uso setGoogleIdTokenRequestOptions()
para activar y configurar Google ID peticiones de señal:
Establecer el ID de cliente servidor para el ID que ha creado en la consola de las API de Google . Tenga en cuenta que esta es la ID de cliente de su servidor, no su ID de cliente de Android.
Configure el cliente para filtrar por cuentas autorizadas. Cuando habilita esta opción, el cliente One Tap solo solicita a los usuarios que inicien sesión en su aplicación con cuentas de Google que ya han usado en el pasado. Hacerlo puede ayudar a los usuarios a iniciar sesión correctamente cuando no están seguros de si ya tienen una cuenta o qué cuenta de Google usaron, y evita que los usuarios creen accidentalmente nuevas cuentas con su aplicación.
Si desea firmar los usuarios de forma automática cuando sea posible, activar la función con
setAutoSelectEnabled()
. El inicio de sesión automático es posible cuando se cumplen los siguientes criterios:- El usuario tiene exactamente una credencial guardada para su aplicación. Es decir, una contraseña guardada o una cuenta de Google guardada.
- El usuario no ha desactivado el inicio de sesión automático en sus ajustes de cuentas de Google .
Si bien es opcional, le recomendamos que considere seriamente el uso de un nonce para mejorar la seguridad de inicio de sesión y evitar ataques de reproducción. Utilice setNonce para incluir un nonce en cada solicitud. Ver SafetyNet es obtener un nonce sección para sugerencias y detalles adicionales sobre la generación de un valor de uso único.
Java
public class YourActivity extends AppCompatActivity { // ... private SignInClient oneTapClient; private BeginSignInRequest signInRequest; @Override public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) { super.onCreate(savedInstanceState, persistentState); oneTapClient = Identity.getSignInClient(this); signInRequest = BeginSignInRequest.builder() .setPasswordRequestOptions(PasswordRequestOptions.builder() .setSupported(true) .build()) .setGoogleIdTokenRequestOptions(GoogleIdTokenRequestOptions.builder() .setSupported(true) // Your server's client ID, not your Android client ID. .setServerClientId(getString(R.string.default_web_client_id)) // Only show accounts previously used to sign in. .setFilterByAuthorizedAccounts(true) .build()) // Automatically sign in when exactly one credential is retrieved. .setAutoSelectEnabled(true) .build(); // ... } // ... }
Kotlin
class YourActivity : AppCompatActivity() { // ... private lateinit var oneTapClient: SignInClient private lateinit var signInRequest: BeginSignInRequest override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) oneTapClient = Identity.getSignInClient(this) signInRequest = BeginSignInRequest.builder() .setPasswordRequestOptions(BeginSignInRequest.PasswordRequestOptions.builder() .setSupported(true) .build()) .setGoogleIdTokenRequestOptions( BeginSignInRequest.GoogleIdTokenRequestOptions.builder() .setSupported(true) // Your server's client ID, not your Android client ID. .setServerClientId(getString(R.string.your_web_client_id)) // Only show accounts previously used to sign in. .setFilterByAuthorizedAccounts(true) .build()) // Automatically sign in when exactly one credential is retrieved. .setAutoSelectEnabled(true) .build() // ... } // ... }
2. Busque un usuario que haya iniciado sesión
Si su Actividad puede ser utilizada por un usuario que haya iniciado sesión o un usuario que haya cerrado la sesión, verifique el estado del usuario antes de mostrar la IU de inicio de sesión de One Tap.
También debe realizar un seguimiento de si el usuario ya se ha negado a utilizar el inicio de sesión de One Tap cerrando el mensaje o tocando fuera de él. Esto puede ser tan simple como una propiedad booleana de su actividad. (Véase dejar de mostrar la interfaz de usuario solo toque , a continuación.)
3. Mostrar la interfaz de usuario de inicio de sesión de One Tap
Si el usuario no está firmado y no lo ha negado a utilizar un grifo de inicio de sesión, la llamada del objeto cliente beginSignIn()
método, y adjuntar a los oyentes a la Task
que devuelve. Aplicaciones típicamente hacer esto en de la Actividad onCreate()
método o después de transiciones de pantalla cuando se utiliza una arquitectura de un solo Actividad.
El cliente de One Tap llamará al oyente de éxito si el usuario tiene credenciales guardadas para su aplicación. En el oyente éxito, obtener la intención pendientes de la Task
resultado y pasarlo a startIntentSenderForResult()
para iniciar la sesión en un grifo de interfaz de usuario.
Si el usuario no tiene credenciales guardadas, el cliente One Tap llamará al oyente de fallas. En este caso, no es necesario realizar ninguna acción: simplemente puede continuar presentando la experiencia de desconexión de la aplicación. Sin embargo, si admite el registro de One Tap, puede comenzar ese flujo aquí para una experiencia de creación de cuenta perfecta. Ver crear nuevas cuentas con un solo toque .
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 saved credentials found. Launch the One Tap sign-up flow, or
// do nothing and continue presenting the signed-out UI.
Log.d(TAG, e.getLocalizedMessage());
}
});
Kotlin
oneTapClient.beginSignIn(signInRequest)
.addOnSuccessListener(this) { result ->
try {
startIntentSenderForResult(
result.pendingIntent.intentSender, REQ_ONE_TAP,
null, 0, 0, 0, null)
} catch (e: IntentSender.SendIntentException) {
Log.e(TAG, "Couldn't start One Tap UI: ${e.localizedMessage}")
}
}
.addOnFailureListener(this) { e ->
// No saved credentials found. Launch the One Tap sign-up flow, or
// do nothing and continue presenting the signed-out UI.
Log.d(TAG, e.localizedMessage)
}
4. Manejar la respuesta del usuario
La respuesta del usuario a Aquel inicio de sesión Toque pronta será reportado a su aplicación usando de su actividad onActivityResult()
método. Si el usuario elige iniciar sesión, el resultado será una credencial guardada. Si el usuario se negó a iniciar sesión, ya sea cerrando el grifo Una interfaz de usuario o tocando fuera de ella, el resultado volverá con el código RESULT_CANCELED
. Tu aplicación necesita manejar ambas posibilidades.
Iniciar sesión con las credenciales recuperadas
Si el usuario eligió credenciales compartir con su aplicación, puede recuperarlos haciendo pasar los datos de intención de onActivityResult()
a que el cliente solo toque getSignInCredentialFromIntent()
método. La credencial tendrá un no nulo googleIdToken
propiedad si el usuario compartió una credencial de la cuenta de Google con su aplicación, o un no nulo password
propiedad si el usuario comparte una contraseña guardada.
Utilice la credencial para autenticarse con el backend de su aplicación.
- Si se recuperó un par de nombre de usuario y contraseña, utilícelos para iniciar sesión de la misma manera que lo haría si el usuario los hubiera proporcionado manualmente.
Si se recuperaron las credenciales de la cuenta de Google, use el token de identificación para autenticarse con su backend. Si ha elegido usar un nonce para ayudar a evitar ataques de repetición, verifique el valor de respuesta en su servidor backend. Ver autenticar con un servidor utilizando fichas de identificación .
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(); String username = credential.getId(); String password = credential.getPassword(); if (idToken != null) { // Got an ID token from Google. Use it to authenticate // with your backend. Log.d(TAG, "Got ID token."); } else if (password != null) { // Got a saved username and password. Use them to authenticate // with your backend. Log.d(TAG, "Got password."); } } 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 val username = credential.id val password = credential.password when { idToken != null -> { // Got an ID token from Google. Use it to authenticate // with your backend. Log.d(TAG, "Got ID token.") } password != null -> { // Got a saved username and password. Use them to authenticate // with your backend. Log.d(TAG, "Got password.") } else -> { // Shouldn't happen. Log.d(TAG, "No ID token or password!") } } } catch (e: ApiException) { // ... } } } } // ... }
Dejar de mostrar la interfaz de usuario de One Tap
Si el usuario se negó a iniciar sesión, la llamada a getSignInCredentialFromIntent()
lanzará una ApiException
con un CommonStatusCodes.CANCELED
código de estado. Cuando esto sucede, debe deshabilitar temporalmente la interfaz de usuario de inicio de sesión de One Tap para no molestar a sus usuarios con mensajes repetidos. El siguiente ejemplo logra esto estableciendo una propiedad en la Actividad, que utiliza para determinar si ofrecer al usuario el inicio de sesión de One Tap; Sin embargo, también se puede guardar un valor de SharedPreferences
o utilizar algún otro método.
Es importante implementar su propia limitación de frecuencia de las indicaciones de inicio de sesión de One Tap. Si no lo hace, y un usuario cancela varias solicitudes seguidas, el cliente de One Tap no lo solicitará al usuario durante las próximas 24 horas.
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})") } } } } } } // ... }
5. Manejar el cierre de sesión
Cuando un usuario de su aplicación, la llamada del cliente Un Toque signOut()
método. Llamando signOut()
deshabilita el inicio de sesión automático hasta que el usuario inicia sesión de nuevo.
Incluso si no utiliza el inicio de sesión automático, este paso es importante porque garantiza que cuando los usuarios cierren la sesión de su aplicación, el estado de autenticación de las API de los servicios de Play que utilice también se restablezca.
Próximos pasos
Si configuró el cliente One Tap para recuperar las credenciales de Google, su aplicación ahora puede obtener tokens de ID de Google que representan las cuentas de Google de sus usuarios. Aprender cómo se puede utilizar estas fichas en el backend .
Si admite acceso de Google, también se puede utilizar el cliente Un Toque para añadir la creación de cuentas sin fricción fluye a su aplicación .