studio - Compruebe si el usuario está autenticado por primera vez en la autenticación de Firebase Google en Android
login google android studio (7)
Estoy usando Firebase Authentication en una aplicación de Android, y estoy usando la autenticación de cuenta de Google como una opción para iniciar sesión en la aplicación.
¿Cómo puedo saber si el usuario ha iniciado sesión en la aplicación por primera vez o no?
De acuerdo con la nueva versión de Firebase auth (16.0.1), la clase AuthResult tiene una función miembro que resulta verdadera o falsa (si el usuario es nuevo). Asumiendo que "credencial" está definido en el alcance (es la credencial de google) . A continuación se muestra un ejemplo: `
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
Log.d(TAG, "linkWithCredential:success");
boolean newuser = task.getResult().getAdditionalUserInfo().isNewUser();
if(newuser){
//Do Stuffs for new user
}else{
//Continue with Sign up
}
} else {
Toast.makeText(MyClass.this, "Authentication failed.",
Toast.LENGTH_SHORT).show();
}
});
Gracias a firebase :)
Desde la versión 11.6.0 podemos usar AdditionalUserInfo.isNewUser()
https://firebase.google.com/docs/reference/android/com/google/firebase/auth/AdditionalUserInfo
Desde los documentos de Firebase-ui , puede verificar la última marca de tiempo de inicio de sesión con la marca de tiempo creada de la siguiente manera:
FirebaseUserMetadata metadata = auth.getCurrentUser().getMetadata();
if (metadata.getCreationTimestamp() == metadata.getLastSignInTimestamp()) {
// The user is new, show them a fancy intro screen!
} else {
// This is an existing user, show them a welcome back screen.
}
Esto puede ayudarte y probarlo:
¿Corregir la ubicación del código para verificar Firebase si ya se ha creado un usuario?
Si bien estoy totalmente de acuerdo en que la forma más correcta (dada la imposibilidad de agregar nuevos campos a la tabla de usuarios de autenticación) es crear una nueva ruta para los usuarios y almacenar información allí, no quise realizar una solicitud adicional después de iniciar sesión en haga esta verificación (estoy usando Firestore y peticiones = dinero).
Necesitaba hacer esta primera verificación de inicio de sesión para solicitar un nombre de usuario (ya que el nombre de visualización se obtiene de Facebook / Google y quería dar la opción de anular si es su primer inicio de sesión). Lo que terminé haciendo fue usar la propiedad photoURL como una bandera para determinar si fue su primera vez o no. No es lo ideal, pero tal vez alguien que quiera ahorrar en solicitudes pueda usar esto como solución alternativa. No es un gran negocio para Firebase, pero para Firestore es más costoso para su plan
Una solución cuando usa Firebase Auth junto con Firestore
La arquitectura raíz de la base de datos Firestore se vería así
Utilice Firebase Auth currentUser.uid
para crear un documento raíz para cada usuario. Comience agregando un campo llamado registered_at
al documento raíz tan pronto como el usuario sea creado la primera vez y luego agregue sus colecciones específicas a su documento raíz, dependiendo de su caso de uso.
Al iniciar sesión o iniciar sesión, puede verificar si el documento con el campo registered_at
ya existe. Si aún no existe, puede tratar al usuario como un nuevo usuario (asumiendo que el usuario no puede eliminar o modificar el campo registered_at
más adelante)
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.firestore.DocumentReference
import com.google.firebase.firestore.FirebaseFirestore
fun rootDocument(): DocumentReference? = rootPath()?.let {
return fireStore().document(it)
}
fun rootPath(): String? {
val loggedInUser = loggedInUser()
if (loggedInUser != null) {
return "users/${loggedInUser.uid}"
}
return null
}
fun fireStore() = FirebaseFirestore.getInstance()
fun createWriteBatch() = fireStore().batch()
fun loggedInUser() = fireAuth().currentUser
fun fireAuth(): FirebaseAuth = FirebaseAuth.getInstance()
fun afterSignIn() {
val rootDocument = rootDocument()
?: throw IllegalStateException("root document not found")
rootDocument.get().addOnCompleteListener {
val isNewUser = it.result.exists().not()
if (isNewUser) {
val batch = createWriteBatch()
batch.set(rootDocument, HashMap<Any, Any>().apply {
put("registered_at", System.currentTimeMillis())
})
batch.commit().addOnCompleteListener {
println("this is a new user")
}
} else {
println("this is not a new user")
}
}
}
Para verificar si es la primera vez que el usuario inicia sesión, simplemente llame al método AdditionalUserInfo.isNewUser()
en la OnCompleteListener.onComplete
llamada OnCompleteListener.onComplete
.
Código de ejemplo a continuación, asegúrese de comprobar si hay null.
OnCompleteListener<AuthResult> completeListener = new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
boolean isNew = task.getResult().getAdditionalUserInfo().isNewUser();
Log.d("MyTAG", "onComplete: " + (isNew ? "new user" : "old user"));
}
}
};
Referencia para la clase AdditionalUserInfo
https://firebase.google.com/docs/reference/android/com/google/firebase/auth/AdditionalUserInfo