Как проверить, является ли пользователь новым или существующим при входе в Google с использованием firebase в flutter?

#android #firebase #flutter #firebase-authentication

#Android #firebase #flutter #firebase-аутентификация

Вопрос:

Я работаю над проектом, в котором пользовательские данные будут сохранены в Fire Store. в этом я создаю новый документ для пользователя, когда пользователь входит в систему с помощью Google. вот мой код ниже

 import 'package:firebase_auth/firebase_auth.dart';
import 'package:gfd_official/User/User.dart';
import 'package:gfd_official/services/database.dart';
import 'package:google_sign_in/google_sign_in.dart';

class GSignInhelp {
 final FirebaseAuth _auth = FirebaseAuth.instance;

 //Firebase User
 Userdat _userFromFirebase(User user) {
 return user != null ? Userdat(uid: user.uid) : null;
 }

 //auth change user stream
 Stream<Userdat> get user {
 return _auth.authStateChanges().map(_userFromFirebase);
}

Future signInWithGoogle() async {
GoogleSignIn googleSignIn = GoogleSignIn();
final account = await googleSignIn.signIn();
final auth = await account.authentication;
final credential = GoogleAuthProvider.credential(
accessToken: auth.accessToken,
idToken: auth.idToken,
);
try {
final res = await _auth.signInWithCredential(credential);
User user = res.user;
await DatabaseService(uid: user.uid)
    .updateUserRole(user.displayName, user.email, 'basic');
return _userFromFirebase(user);
} catch (e) {
  print(e.toString());
  return null;
  }
}

Future logOut() async {
try {
  GoogleSignIn().signOut();
  return await _auth.signOut();
} catch (e) {
  print(e.toString());
  return null;
}
}
}
  

Я успешно могу изменить роль пользователя в fire store, но, как вы можете видеть, когда пользователь регистрируется в значениях базы данных, будет установлено значение по умолчанию, но я этого не хочу. Итак, мой вопрос в том, как я могу это проверить, если пользователь вошел в систему в первый раз или возвращает пользователя.

Если пользователь возвращается, я не хочу сбрасывать данные пользователя в хранилище Fire, а если пользователь новый, то создайте документ в хранилище Fire со значениями по умолчанию.

Вывод: как я могу проверить, что при входе пользователя в систему с помощью Google пользователь является существующим пользователем или новым пользователем?

Комментарии:

1. Вы можете вручную создать объект user в базе данных, который содержит данные для этого пользователя, и если пользователь существует в базе данных, то он старый, если нет, то он новый

2. @AhmadSattout мы можем это сделать, но всякий раз, когда пользователь закрывает приложение и снова открывает пользовательские данные, в fire Store устанавливается значение по умолчанию

Ответ №1:

Вы можете проверить пользователя, является ли он новым или ранее зарегистрированным пользователем User Credential , и через него вы можете получить authResult.additionalUserInfo.isNewUser , если пользователь еще не зарегистрирован ранее.

Вы можете использовать этот код:

  Future<UserCredential> signInWithGoogle(BuildContext context) async {

    FirebaseAuth _auth = FirebaseAuth.instance;
    // Trigger the authentication flow
    final GoogleSignInAccount googleUser = await GoogleSignIn().signIn();

    // Obtain the auth details from the request
    final GoogleSignInAuthentication googleAuth =
        await googleUser.authentication;

    // Create a new credential
    final GoogleAuthCredential credential = GoogleAuthProvider.credential(
      accessToken: googleAuth.accessToken,
      idToken: googleAuth.idToken,
    );

    final UserCredential authResult =
        await _auth.signInWithCredential(credential);

    final User user = authResult.user;

    ///Her to check isNewUser OR Not
    if (authResult.additionalUserInfo.isNewUser) {
      if (user != null) {
      //You can her set data user in Fire store
      //Ex: Go to RegisterPage()
        }

      }
    } else {
     
      //Ex: Go to HomePage()
    }

    return await FirebaseAuth.instance.signInWithCredential(credential);
  }
  

Ответ №2:

Вот полный код для входа и выхода из Google :-

 class GSignInhelp {  
final FirebaseAuth _auth = FirebaseAuth.instance;   //Firebase User   
Userdat _userFromFirebaseUser(User user) {    
          return user != null ? Userdat(uid: user.uid) : null;   }   //auth 
         change user stream   
         Stream get user {    
             return _auth.authStateChanges().map(_userFromFirebaseUser);   
        }   
   Future signInWithGoogle() async {     
         GoogleSignIn googleSignIn = 
    GoogleSignIn();