Проверьте, прошла ли аутентификация пользователя впервые в Firebase Google Authentication в Android
Я использую Аутентификацию Firebase в приложении Android, и я использую аутентификацию аккаунта Google в качестве опции для входа в приложение.
Как я могу узнать, вошел ли пользователь в приложение в первый раз или нет?
Ответы
Ответ 1
Чтобы проверить, входит ли пользователь в первый раз, просто вызовите метод AdditionalUserInfo.isNewUser()
в OnCompleteListener.onComplete
.
Пример кода ниже, обязательно проверьте на нулевое значение.
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"));
}
}
};
Проверьте документы для получения AdditionalUserInfo
ссылки AdditionalUserInfo
Ответ 2
В документации Firebase-ui вы можете проверить последнюю временную метку входа по временной метке, созданной при:
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.
}
Ответ 3
В соответствии с новой версией Firebase auth (16.0.1) класс AuthResult имеет функцию-член, которая возвращает true или false (если пользователь новый). Предполагая, что в области определены "учетные данные" (это учетные данные Google). Пример показан ниже: '
private FirebaseAuth mAuth;
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();
mAuth = FirebaseAuth.getInstance();
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
GoogleSignInAccount acct = task.getResult(ApiException.class);
AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
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();
}
});
Благодаря Firebase :)
Ответ 4
В версии 11.6.0 мы можем использовать AdditionalUserInfo.isNewUser()
https://firebase.google.com/docs/reference/android/com/google/firebase/auth/AdditionalUserInfo
Ответ 5
Решение, когда вы используете Firebase Auth вместе с Firestore
Корневая архитектура базы данных Firestore будет выглядеть так:
![введите описание изображения здесь]()
Используйте Firebase Auth currentUser.uid
для создания корневого документа для каждого пользователя. Начните с добавления поля под названием registered_at
в корневой документ, как только пользователь будет создан в первый раз, а затем добавит ваши конкретные коллекции в ваш корневой документ в зависимости от вашего варианта использования.
При входе или входе в систему вы можете проверить, существует ли документ с полем registered_at
. Если он еще не существует, вы можете обращаться с пользователем как новым пользователем (при условии, что пользователь не может удалить или изменить поле registered_at
позже)
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")
}
}
}
Ответ 6
Это может помочь вам и попробовать:
Исправить местоположение кода, чтобы проверить Firebase, если пользователь уже был создан?
Ответ 7
Хотя я полностью согласен с тем, что наиболее правильный способ (учитывая невозможность добавления новых полей в таблицу пользователя auth) заключается в создании нового пути для пользователей и хранении информации там, я не хотел делать дополнительный запрос после войдите в систему, чтобы сделать эту проверку (я использую Firestore и запросы = деньги).
Мне нужно было выполнить эту первую проверку входа, чтобы вызвать имя пользователя (поскольку отображаемое имя вытаскивается из Facebook/Google, и я хотел бы дать возможность переопределить, если это их первый логин). В результате я использовал свойство photoURL в качестве флага, чтобы определить, был ли это их первый раз или нет. Это не идеально, но, возможно, кто-то, кто хочет сэкономить на запросах, может использовать это как обходной путь. Это не такая большая сделка для Firebase, но для Firestore это более дорогостоящее для вашего плана.
Ответ 8
Когда пользователь впервые регистрируется в пароле reset.
Вы можете отправить пароль reset электронной почты пользователю с помощью метода sendPasswordResetEmail.
ссылка: https://firebase.google.com/docs/auth/android/manage-users
тогда пользователь получит параметр reset password и сменит пароль и логин с новыми учетными данными, и если пользователь выдаст неправильный идентификатор почты, то он не сможет войти в систему.