Проблема аутентификации Firebase: Могу ли я управлять аутентификацией Firebase таким образом, чтобы она игнорировала изменение состояния после регистрации пользователя? - PullRequest
0 голосов
/ 13 июля 2020

Я использую систему аутентификации Firebase для входа и регистрации и Cloud Firestore в качестве базы данных.

Это поток FirebaseUser, который я использовал, чтобы определить, какой пользователь вошел в систему (поэтому мне не нужно снова входить в систему и снова каждый раз, когда я открываю приложение) и обнаруживаю изменения авторизации в случае выхода пользователя из системы:

Stream<FirebaseUser> get user{
    return _auth.onAuthStateChanged;
  }

Я добавил этот поток вверху дерева виджетов:

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    

    return StreamProvider<FirebaseUser>.value(
      value: FirebaseAPI().user,
      child: ChangeNotifierProvider<SavedUser>(
        create: (_) => SavedUser(),
        child: MaterialApp(
          home: Wrapper(),
        ),
      ),
    );
  }
}

[FirebaseAPI () - это класс, содержащий все функции FirebaseAuth, включая поток FirebaseUser.]

Теперь проблема, с которой я столкнулся, заключается в том, что после регистрации пользователя и перезапуска приложения .... .. Этот зарегистрированный пользователь автоматически входит в систему. Но я не хочу этого делать.

На самом деле мое приложение работает примерно так:

  1. Пользователь регистрируется. (Его зарегистрированные данные попадают в коллекцию «Ожидание» в базе данных).
Future<dynamic> sendUserRegistrationtoPending(String name,String email,String password,String branch)
  {
      return databaseReference.collection('Pending').document(name).setData(<String,dynamic>{
        'Email' : email,
        'Password' : password,
        'Branch' : branch,
        'Status' : 'user',
      }).then((value){return "Success";});
  }

[Нет взаимодействия с FirebaseAuth при отправке этого пользователя в «Ожидание»]

Затем админ получает карточку уведомления зарегистрированного пользователя. После принятия регистрации пользователь будет перемещен из коллекции «Ожидает» в «Пользователь», и, следовательно, пользователь станет действующим пользователем и сможет войти в систему.
  Future<dynamic> registerUserFromPending(String name,String email,String password,String branch,String phone) async
  {
     AuthResult result = await _auth.createUserWithEmailAndPassword(email: email, password: password);

     if(result == null)
       print("Error is Firebase Auth while registering");
     else{
       databaseReference.collection('Pending').document(name).delete();
       return databaseReference.collection('User').document(result.user.uid).setData(<String,dynamic>{
         "Name" : name,
         "Email" : email,
         "Password" : password,
         "Branch" : branch,
         'Phone' : phone,
         "Status" : 'user',
       }).then((value){
        return "Success";
       }).catchError((a){
         return a;
       });
     }
  }

Здесь я Я использую функцию FirebaseAuth для регистрации пользователя в Firebase и предоставления UID пользователю, чтобы Firebase распознала его, как только пользователь войдет в систему.

Моя точка зрения ....... Скажем, я Мы с администратором приняли регистрацию пользователя. Тогда я не хочу входить в систему под этим идентификатором пользователя после того, как открою приложение.

Надеюсь, вы поняли суть моего вопроса.

Заранее большое спасибо за ответ. :)

Обновление:

В качестве временного исправления я сделал следующее:

Future<dynamic> registerUserFromPending(String adminEmail,String adminPassword,String name,String email,String password,String branch,String phone) async
  {
    String uid;
     _auth.createUserWithEmailAndPassword(email: email, password: password).then((newUid){
       if(newUid == null)
         print("Error in Auth");
       else{
         uid = newUid.user.uid;
         FirebaseAPI().loginWithEmailAndPassword(adminEmail, adminPassword).then((value){

           print("Me : \n" + "Email ID : " + value.email);
           databaseReference.collection('Pending').document(name).delete();
           return databaseReference.collection('User').document(uid).setData(<String,dynamic>{
             "Name" : name,
             "Email" : email,
             "Password" : password,
             "Branch" : branch,
             'Phone' : phone,
             "Status" : 'user',
           }).then((value){
             return "Success";
           }).catchError((a){
             return a;
           });
         });
       }
     });
  }

Здесь я повторно вхожу в админку после принятия регистрации нового пользователя ....... Но я не думаю, что это лучший способ сделать это. Пожалуйста, предложите лучший способ, если он есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...