Advertencia: estos datos se proporcionan en virtud de la Política de datos de usuario de Google . Revise y cumpla con la política. El no hacerlo puede resultar en la suspensión del proyecto o la suspensión de la cuenta.

Iniciar sesión a los usuarios con sus credenciales guardadas

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.

Interfaz de usuario de inicio de sesión con un toque

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

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 .