#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();