Agregue fácilmente el inicio de sesión a su aplicación de Android con FirebaseUI

FirebaseUI es una biblioteca creada sobre el SDK de autenticación de Firebase que proporciona flujos de interfaz de usuario directos para usar en su aplicación. FirebaseUI proporciona los siguientes beneficios:

  • Múltiples proveedores : flujos de inicio de sesión para correo electrónico/contraseña, enlace de correo electrónico, autenticación telefónica, inicio de sesión de Google, inicio de sesión de Facebook, inicio de sesión de Twitter e inicio de sesión de GitHub.
  • Gestión de cuentas : flujos para gestionar tareas de gestión de cuentas, como la creación de cuentas y el restablecimiento de contraseñas.
  • Vinculación de cuentas : fluye para vincular de forma segura cuentas de usuarios entre proveedores de identidad.
  • Actualización de usuarios anónimos : flujos para actualizar de forma segura a usuarios anónimos.
  • Temas personalizados : personaliza el aspecto de FirebaseUI para que coincida con tu aplicación. Además, como FirebaseUI es de código abierto, puedes bifurcar el proyecto y personalizarlo exactamente según tus necesidades.
  • Smart Lock para contraseñas : integración automática con Smart Lock para contraseñas para un inicio de sesión rápido entre dispositivos.

Antes de que empieces

  1. Si aún no lo has hecho, agrega Firebase a tu proyecto de Android .

  2. Agregue las dependencias de FirebaseUI a su archivo build.gradle a nivel de aplicación. Si desea admitir el inicio de sesión con Facebook o Twitter, incluya también los SDK de Facebook y Twitter:

    dependencies {
        // ...
    
        implementation 'com.firebaseui:firebase-ui-auth:7.2.0'
    
        // Required only if Facebook login support is required
        // Find the latest Facebook SDK releases here: https://goo.gl/Ce5L94
        implementation 'com.facebook.android:facebook-android-sdk:8.x'
    }
    

    El SDK de autenticación de FirebaseUI tiene dependencias transitivas en el SDK de Firebase y en el SDK de servicios de Google Play.

  3. En Firebase console , abre la sección Autenticación y habilita los métodos de inicio de sesión que deseas admitir. Algunos métodos de inicio de sesión requieren información adicional, generalmente disponible en la consola de desarrollador del servicio.

  4. Si habilitó el inicio de sesión de Google:

    1. Cuando se le solicite en la consola, descargue el archivo de configuración de Firebase actualizado ( google-services.json ), que ahora contiene la información del cliente OAuth necesaria para iniciar sesión en Google.

    2. Mueva este archivo de configuración actualizado a su proyecto de Android Studio, reemplazando el archivo de configuración correspondiente ahora obsoleto. (Consulta Agregar Firebase a tu proyecto de Android ).

    3. Si aún no ha especificado la huella digital SHA de su aplicación, hágalo desde la página Configuración de Firebase console. Consulte Autenticar a su cliente para obtener detalles sobre cómo obtener la huella digital SHA de su aplicación.

  5. Si admite el inicio de sesión con Facebook o Twitter, agregue recursos de cadena a strings.xml que especifiquen la información de identificación requerida por cada proveedor:

    
    <resources>
      <!-- Facebook application ID and custom URL scheme (app ID prefixed by 'fb'). -->
      <string name="facebook_application_id" translatable="false">YOUR_APP_ID</string>
      <string name="facebook_login_protocol_scheme" translatable="false">fbYOUR_APP_ID</string>
    </resources>
    

Iniciar sesión

Cree un ActivityResultLauncher que registre una devolución de llamada para el contrato de resultado de la actividad de FirebaseUI:

Kotlin+KTX

// See: https://developer.android.com/training/basics/intents/result
private val signInLauncher = registerForActivityResult(
    FirebaseAuthUIActivityResultContract(),
) { res ->
    this.onSignInResult(res)
}

Java

// See: https://developer.android.com/training/basics/intents/result
private final ActivityResultLauncher<Intent> signInLauncher = registerForActivityResult(
        new FirebaseAuthUIActivityResultContract(),
        new ActivityResultCallback<FirebaseAuthUIAuthenticationResult>() {
            @Override
            public void onActivityResult(FirebaseAuthUIAuthenticationResult result) {
                onSignInResult(result);
            }
        }
);

Para iniciar el flujo de inicio de sesión de FirebaseUI, cree una intención de inicio de sesión con sus métodos de inicio de sesión preferidos:

Kotlin+KTX

// Choose authentication providers
val providers = arrayListOf(
    AuthUI.IdpConfig.EmailBuilder().build(),
    AuthUI.IdpConfig.PhoneBuilder().build(),
    AuthUI.IdpConfig.GoogleBuilder().build(),
    AuthUI.IdpConfig.FacebookBuilder().build(),
    AuthUI.IdpConfig.TwitterBuilder().build(),
)

// Create and launch sign-in intent
val signInIntent = AuthUI.getInstance()
    .createSignInIntentBuilder()
    .setAvailableProviders(providers)
    .build()
signInLauncher.launch(signInIntent)

Java

// Choose authentication providers
List<AuthUI.IdpConfig> providers = Arrays.asList(
        new AuthUI.IdpConfig.EmailBuilder().build(),
        new AuthUI.IdpConfig.PhoneBuilder().build(),
        new AuthUI.IdpConfig.GoogleBuilder().build(),
        new AuthUI.IdpConfig.FacebookBuilder().build(),
        new AuthUI.IdpConfig.TwitterBuilder().build());

// Create and launch sign-in intent
Intent signInIntent = AuthUI.getInstance()
        .createSignInIntentBuilder()
        .setAvailableProviders(providers)
        .build();
signInLauncher.launch(signInIntent);

Cuando se complete el flujo de inicio de sesión, recibirá el resultado en onSignInResult :

Kotlin+KTX

private fun onSignInResult(result: FirebaseAuthUIAuthenticationResult) {
    val response = result.idpResponse
    if (result.resultCode == RESULT_OK) {
        // Successfully signed in
        val user = FirebaseAuth.getInstance().currentUser
        // ...
    } else {
        // Sign in failed. If response is null the user canceled the
        // sign-in flow using the back button. Otherwise check
        // response.getError().getErrorCode() and handle the error.
        // ...
    }
}

Java

private void onSignInResult(FirebaseAuthUIAuthenticationResult result) {
    IdpResponse response = result.getIdpResponse();
    if (result.getResultCode() == RESULT_OK) {
        // Successfully signed in
        FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
        // ...
    } else {
        // Sign in failed. If response is null the user canceled the
        // sign-in flow using the back button. Otherwise check
        // response.getError().getErrorCode() and handle the error.
        // ...
    }
}

Configurar métodos de inicio de sesión

  1. En Firebase console , abre la sección Autenticación . En la pestaña Método de inicio de sesión , habilite el proveedor de correo electrónico/contraseña . Tenga en cuenta que el inicio de sesión por correo electrónico/contraseña debe estar habilitado para utilizar el inicio de sesión mediante enlace de correo electrónico.

  2. En la misma sección, habilite el método de inicio de sesión mediante enlace de correo electrónico (inicio de sesión sin contraseña) y haga clic en Guardar .

  3. También deberá habilitar Firebase Dynamic Links para utilizar el inicio de sesión mediante enlace de correo electrónico. En Firebase console , haga clic en Dynamic Links en Engage en la barra de navegación. Haga clic en Comenzando y agregue un dominio. El dominio que elija aquí se reflejará en los enlaces de correo electrónico enviados a sus usuarios.

  4. Puede habilitar el inicio de sesión con enlace de correo electrónico en FirebaseUI llamando a enableEmailLinkSignIn en una instancia EmailBuilder . También deberá proporcionar un objeto ActionCodeSettings válido con setHandleCodeInApp establecido en verdadero. Además, debe incluir en la lista blanca la URL que pasa a setUrl , lo que se puede hacer en Firebase console , en Autenticación -> Métodos de inicio de sesión -> Dominios autorizados.

    Kotlin+KTX

    val actionCodeSettings = ActionCodeSettings.newBuilder()
        .setAndroidPackageName( // yourPackageName=
            "...", // installIfNotAvailable=
            true, // minimumVersion=
            null,
        )
        .setHandleCodeInApp(true) // This must be set to true
        .setUrl("https://google.com") // This URL needs to be whitelisted
        .build()
    
    val providers = listOf(
        EmailBuilder()
            .enableEmailLinkSignIn()
            .setActionCodeSettings(actionCodeSettings)
            .build(),
    )
    val signInIntent = AuthUI.getInstance()
        .createSignInIntentBuilder()
        .setAvailableProviders(providers)
        .build()
    signInLauncher.launch(signInIntent)

    Java

    ActionCodeSettings actionCodeSettings = ActionCodeSettings.newBuilder()
            .setAndroidPackageName(
                    /* yourPackageName= */ "...",
                    /* installIfNotAvailable= */ true,
                    /* minimumVersion= */ null)
            .setHandleCodeInApp(true) // This must be set to true
            .setUrl("https://google.com") // This URL needs to be whitelisted
            .build();
    
    List<AuthUI.IdpConfig> providers = Arrays.asList(
            new AuthUI.IdpConfig.EmailBuilder()
                    .enableEmailLinkSignIn()
                    .setActionCodeSettings(actionCodeSettings)
                    .build()
    );
    Intent signInIntent = AuthUI.getInstance()
            .createSignInIntentBuilder()
            .setAvailableProviders(providers)
            .build();
    signInLauncher.launch(signInIntent);
  5. Si desea ver el enlace en una actividad específica, siga los pasos que se describen aquí . De lo contrario, el enlace redirigirá a su actividad de inicio.

  6. Una vez que capte el enlace profundo, deberá llamar para verificar que podamos manejarlo por usted. Si podemos, deberá enviárnoslo a través de setEmailLink .

    Kotlin+KTX

    if (AuthUI.canHandleIntent(intent)) {
        val extras = intent.extras ?: return
        val link = extras.getString("email_link_sign_in")
        if (link != null) {
            val signInIntent = AuthUI.getInstance()
                .createSignInIntentBuilder()
                .setEmailLink(link)
                .setAvailableProviders(providers)
                .build()
            signInLauncher.launch(signInIntent)
        }
    }

    Java

    if (AuthUI.canHandleIntent(getIntent())) {
        if (getIntent().getExtras() == null) {
            return;
        }
        String link = getIntent().getExtras().getString("email_link_sign_in");
        if (link != null) {
            Intent signInIntent = AuthUI.getInstance()
                    .createSignInIntentBuilder()
                    .setEmailLink(link)
                    .setAvailableProviders(providers)
                    .build();
            signInLauncher.launch(signInIntent);
        }
    }
  7. Se admite el inicio de sesión opcional con enlace de correo electrónico entre dispositivos, lo que significa que el enlace enviado a través de su aplicación de Android se puede utilizar para iniciar sesión en su web o aplicaciones de Apple. De forma predeterminada, la compatibilidad con varios dispositivos está habilitada. Puede desactivarlo llamando setForceSameDevice en la instancia EmailBuilder .

    Consulte FirebaseUI-Web y FirebaseUI-iOS para obtener más información.

Desconectar

FirebaseUI proporciona métodos convenientes para cerrar sesión en Firebase Authentication, así como en todos los proveedores de identidad social:

Kotlin+KTX

AuthUI.getInstance()
    .signOut(this)
    .addOnCompleteListener {
        // ...
    }

Java

AuthUI.getInstance()
        .signOut(this)
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            public void onComplete(@NonNull Task<Void> task) {
                // ...
            }
        });

También puedes eliminar completamente la cuenta del usuario:

Kotlin+KTX

AuthUI.getInstance()
    .delete(this)
    .addOnCompleteListener {
        // ...
    }

Java

AuthUI.getInstance()
        .delete(this)
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                // ...
            }
        });

Personalización

De forma predeterminada, FirebaseUI usa AppCompat para la temática, lo que significa que adoptará naturalmente la combinación de colores de su aplicación. Si necesita una mayor personalización, puede pasar un tema y un logotipo al generador Intent inicio de sesión:

Kotlin+KTX

val signInIntent = AuthUI.getInstance()
    .createSignInIntentBuilder()
    .setAvailableProviders(providers)
    .setLogo(R.drawable.my_great_logo) // Set logo drawable
    .setTheme(R.style.MySuperAppTheme) // Set theme
    .build()
signInLauncher.launch(signInIntent)

Java

Intent signInIntent = AuthUI.getInstance()
        .createSignInIntentBuilder()
        .setAvailableProviders(providers)
        .setLogo(R.drawable.my_great_logo)      // Set logo drawable
        .setTheme(R.style.MySuperAppTheme)      // Set theme
        .build();
signInLauncher.launch(signInIntent);

También puede establecer una política de privacidad y términos de servicio personalizados:

Kotlin+KTX

val signInIntent = AuthUI.getInstance()
    .createSignInIntentBuilder()
    .setAvailableProviders(providers)
    .setTosAndPrivacyPolicyUrls(
        "https://example.com/terms.html",
        "https://example.com/privacy.html",
    )
    .build()
signInLauncher.launch(signInIntent)

Java

Intent signInIntent = AuthUI.getInstance()
        .createSignInIntentBuilder()
        .setAvailableProviders(providers)
        .setTosAndPrivacyPolicyUrls(
                "https://example.com/terms.html",
                "https://example.com/privacy.html")
        .build();
signInLauncher.launch(signInIntent);

Próximos pasos

  • Para obtener más información sobre el uso y la personalización de FirebaseUI, consulte el archivo README en GitHub.
  • Si encuentra un problema en FirebaseUI y desea informarlo, utilice el rastreador de problemas de GitHub .