Puedes dejar que los usuarios se autentiquen con Firebase mediante sus cuentas de GitHub, con solo integrar un acceso genérico basado en web de OAuth en tu app, usando el SDK de Firebase para llevar a cabo el flujo de acceso de extremo a extremo.
Antes de comenzar
Para que los usuarios accedan con cuentas de GitHub, primero debes habilitar GitHub como un proveedor de acceso para tu proyecto de Firebase. Para ello, sigue estos pasos:
Si aún no lo has hecho, agrega Firebase a tu proyecto de Android.
- En Firebase console, abre la sección Auth.
- En la pestaña Método de acceso, habilita el proveedor de GitHub.
- Agrega a la configuración correspondiente el ID de cliente y el Secreto de cliente de la consola para
desarrolladores del proveedor:
- Registra tu app como aplicación de desarrollador en GitHub y obtén el ID de cliente y el Secreto de cliente de OAuth 2.0.
- Asegúrate de que tu URI de redireccionamiento de OAuth de Firebase (p. ej.,
my-app-12345.firebaseapp.com/__/auth/handler
) esté configurado como URL de devolución de llamada de autorización en la página de configuración de tu app en GitHub.
- Haz clic en Guardar.
En el archivo de Gradle (generalmente
<project>/<app-module>/build.gradle.kts
o<project>/<app-module>/build.gradle
) del módulo (a nivel de app), agrega la dependencia de la biblioteca de Android para Firebase Authentication. Te recomendamos usar la BoM de Firebase para Android para controlar las versiones de las bibliotecas.Kotlin+KTX
dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:32.3.1")) // Add the dependency for the Firebase Authentication library // When using the BoM, you don't specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-auth-ktx") }
Si usas la BoM de Firebase para Android, tu app siempre utilizará versiones compatibles de las bibliotecas de Firebase para Android.
(Alternativa) Agrega dependencias de la biblioteca de Firebase sin usar la BoM
Si eliges no usar la BoM de Firebase, debes especificar cada versión de la biblioteca de Firebase en su línea de dependencia.
Ten en cuenta que, si usas múltiples bibliotecas de Firebase en tu app, es muy recomendable que utilices la BoM para administrar las versiones de las bibliotecas para garantizar que todas las versiones sean compatibles.
dependencies { // Add the dependency for the Firebase Authentication library // When NOT using the BoM, you must specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-auth-ktx:22.1.2") }
Java
dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:32.3.1")) // Add the dependency for the Firebase Authentication library // When using the BoM, you don't specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-auth") }
Si usas la BoM de Firebase para Android, tu app siempre utilizará versiones compatibles de las bibliotecas de Firebase para Android.
(Alternativa) Agrega dependencias de la biblioteca de Firebase sin usar la BoM
Si eliges no usar la BoM de Firebase, debes especificar cada versión de la biblioteca de Firebase en su línea de dependencia.
Ten en cuenta que, si usas múltiples bibliotecas de Firebase en tu app, es muy recomendable que utilices la BoM para administrar las versiones de las bibliotecas a fin de garantizar que todas las versiones sean compatibles.
dependencies { // Add the dependency for the Firebase Authentication library // When NOT using the BoM, you must specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-auth:22.1.2") }
Si aún no has especificado la huella digital SHA-1 de tu app, hazlo desde la página de configuración de Firebase console. Consulta Autenticación de tu cliente para obtener detalles sobre cómo obtener la huella digital SHA-1 de tu app.
Maneja el flujo de acceso con el SDK de Firebase
Si estás creando una app para Android, la manera más sencilla de autenticar a tus usuarios con Firebase mediante sus cuentas de GitHub es manejar el flujo de acceso con el SDK de Firebase Android.
Para manejar el flujo de acceso con el SDK de Firebase Android, sigue estos pasos:
Crea una instancia de un OAuthProvider mediante su compilador con el ID de proveedor github.com.
Kotlin+KTX
val provider = OAuthProvider.newBuilder("github.com")
Java
OAuthProvider.Builder provider = OAuthProvider.newBuilder("github.com");
Opcional: Especifica parámetros de OAuth personalizados adicionales que quieras enviar con la solicitud de OAuth.
Kotlin+KTX
// Target specific email with login hint. provider.addCustomParameter("login", "your-email@gmail.com")
Java
// Target specific email with login hint. provider.addCustomParameter("login", "your-email@gmail.com");
Para conocer los parámetros que admite GitHub, consulta la documentación de OAuth de GitHub. Ten en cuenta que no puedes pasar los parámetros obligatorios de Firebase con
setCustomParameters()
. Estos parámetros son client_id, response_type, redirect_uri, state, scope y response_mode.Opcional: Especifica permisos de OAuth 2.0 adicionales aparte del perfil básico que quieres solicitar al proveedor de autenticación. Si tu aplicación requiere acceso a datos privados del usuario desde las API de GitHub, deberás solicitar permiso para acceder a esas API en Permisos de API en la consola para desarrolladores de GitHub. Los permisos de OAuth solicitados deben coincidir exactamente con los preconfigurados en los permisos de API de la app.
Kotlin+KTX
// Request read access to a user's email addresses. // This must be preconfigured in the app's API permissions. provider.scopes = listOf("user:email")
Java
// Request read access to a user's email addresses. // This must be preconfigured in the app's API permissions. List<String> scopes = new ArrayList<String>() { { add("user:email"); } }; provider.setScopes(scopes);
Autentica con Firebase mediante el objeto del proveedor de OAuth. Ten en cuenta que, a diferencia de otras operaciones de Firebase Auth, esta tomará el control de tu IU mediante una pestaña personalizada emergente de Chrome. Por lo tanto, no hagas referencia a tu actividad en el
OnSuccessListener
ni en elOnFailureListener
que conectas, ya que se desvincularán inmediatamente cuando la operación inicie la IU.Lo primero que debes hacer es revisar si ya recibiste una respuesta. Acceder a través de este método coloca tu actividad en segundo plano, lo que significa que el sistema puede volver a reclamarla durante el flujo de acceso. Para asegurarte de no hacer que el usuario realice otro intento en caso de que esto ocurra, debes revisar si ya hay un resultado.
Para verificar si hay un resultado pendiente, llama a
getPendingAuthResult
:Kotlin+KTX
val pendingResultTask = firebaseAuth.pendingAuthResult if (pendingResultTask != null) { // There's something already here! Finish the sign-in for your user. pendingResultTask .addOnSuccessListener { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } .addOnFailureListener { // Handle failure. } } else { // There's no pending result so you need to start the sign-in flow. // See below. }
Java
Task<AuthResult> pendingResultTask = firebaseAuth.getPendingAuthResult(); if (pendingResultTask != null) { // There's something already here! Finish the sign-in for your user. pendingResultTask .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } }); } else { // There's no pending result so you need to start the sign-in flow. // See below. }
Para iniciar el flujo de acceso, llama a
startActivityForSignInWithProvider
:Kotlin+KTX
firebaseAuth .startActivityForSignInWithProvider(activity, provider.build()) .addOnSuccessListener { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } .addOnFailureListener { // Handle failure. }
Java
firebaseAuth .startActivityForSignInWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
Si se completa correctamente, el token de acceso de OAuth asociado con el proveedor se puede recuperar a partir del objeto
OAuthCredential
que se muestra.Mediante el token de acceso de OAuth, puedes llamar a la API de GitHub.
Por ejemplo, para obtener la información básica de perfil, puedes llamar a la API de REST y pasar el token de acceso en el encabezado
Authorization
:Si bien los ejemplos anteriores se enfocan en los flujos de acceso, también puedes vincular un proveedor de GitHub con un usuario existente mediante
startActivityForLinkWithProvider
. Por ejemplo, puedes vincular varios proveedores al mismo usuario para que este pueda acceder con cualquiera de ellos.Kotlin+KTX
// The user is already signed-in. val firebaseUser = firebaseAuth.currentUser!! firebaseUser .startActivityForLinkWithProvider(activity, provider.build()) .addOnSuccessListener { // Provider credential is linked to the current user. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // authResult.getCredential().getAccessToken(). // The OAuth secret can be retrieved by calling: // authResult.getCredential().getSecret(). } .addOnFailureListener { // Handle failure. }
Java
// The user is already signed-in. FirebaseUser firebaseUser = firebaseAuth.getCurrentUser(); firebaseUser .startActivityForLinkWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // Provider credential is linked to the current user. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // authResult.getCredential().getAccessToken(). // The OAuth secret can be retrieved by calling: // authResult.getCredential().getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
Se puede utilizar el mismo patrón con
startActivityForReauthenticateWithProvider
, que se puede usar a fin de recuperar credenciales nuevas para operaciones sensibles que requieren un acceso reciente.Kotlin+KTX
// The user is already signed-in. val firebaseUser = firebaseAuth.currentUser!! firebaseUser .startActivityForReauthenticateWithProvider(activity, provider.build()) .addOnSuccessListener { // User is re-authenticated with fresh tokens and // should be able to perform sensitive operations // like account deletion and email or password // update. } .addOnFailureListener { // Handle failure. }
Java
// The user is already signed-in. FirebaseUser firebaseUser = firebaseAuth.getCurrentUser(); firebaseUser .startActivityForReauthenticateWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is re-authenticated with fresh tokens and // should be able to perform sensitive operations // like account deletion and email or password // update. } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
Próximos pasos
Cuando un usuario accede por primera vez, se crea una cuenta de usuario nueva y se la vincula con las credenciales (el nombre de usuario y la contraseña, el número de teléfono o la información del proveedor de autenticación) que el usuario utilizó para acceder. Esta cuenta nueva se almacena como parte de tu proyecto de Firebase y se puede usar para identificar a un usuario en todas las apps del proyecto, sin importar cómo acceda.
-
En tus apps, puedes obtener la información básica del perfil del usuario a partir del objeto
FirebaseUser
. Consulta Administra usuarios. En tus reglas de seguridad de Firebase Realtime Database y Cloud Storage, puedes obtener el ID del usuario único que accedió a partir de la variable
auth
y usarlo para controlar a qué datos podrá acceder.
Para permitir que los usuarios accedan a la app con varios proveedores de autenticación, puedes vincular las credenciales de estos proveedores con una cuenta de usuario existente.
Para salir de la sesión de un usuario, llama a signOut
de la siguiente manera:
Kotlin+KTX
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();