Я использую Аутентификацию Firebase в приложении Android, и я использую аутентификацию аккаунта Google в качестве опции для входа в приложение.
Как я могу узнать, вошел ли пользователь в приложение в первый раз или нет?
Я использую Аутентификацию Firebase в приложении Android, и я использую аутентификацию аккаунта Google в качестве опции для входа в приложение.
Как я могу узнать, вошел ли пользователь в приложение в первый раз или нет?
Чтобы проверить, входит ли пользователь в первый раз, просто вызовите метод 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
В документации 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.
}
В соответствии с новой версией 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 :)
В версии 11.6.0 мы можем использовать AdditionalUserInfo.isNewUser()
https://firebase.google.com/docs/reference/android/com/google/firebase/auth/AdditionalUserInfo
Решение, когда вы используете 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")
}
}
}
Это может помочь вам и попробовать:
Исправить местоположение кода, чтобы проверить Firebase, если пользователь уже был создан?
Хотя я полностью согласен с тем, что наиболее правильный способ (учитывая невозможность добавления новых полей в таблицу пользователя auth) заключается в создании нового пути для пользователей и хранении информации там, я не хотел делать дополнительный запрос после войдите в систему, чтобы сделать эту проверку (я использую Firestore и запросы = деньги).
Мне нужно было выполнить эту первую проверку входа, чтобы вызвать имя пользователя (поскольку отображаемое имя вытаскивается из Facebook/Google, и я хотел бы дать возможность переопределить, если это их первый логин). В результате я использовал свойство photoURL в качестве флага, чтобы определить, был ли это их первый раз или нет. Это не идеально, но, возможно, кто-то, кто хочет сэкономить на запросах, может использовать это как обходной путь. Это не такая большая сделка для Firebase, но для Firestore это более дорогостоящее для вашего плана.
Когда пользователь впервые регистрируется в пароле reset. Вы можете отправить пароль reset электронной почты пользователю с помощью метода sendPasswordResetEmail. ссылка: https://firebase.google.com/docs/auth/android/manage-users
тогда пользователь получит параметр reset password и сменит пароль и логин с новыми учетными данными, и если пользователь выдаст неправильный идентификатор почты, то он не сможет войти в систему.