flatter:Firebase身份验证创建用户而不自动登录

flatter:Firebase身份验证创建用户而不自动登录,firebase,dart,flutter,firebase-authentication,Firebase,Dart,Flutter,Firebase Authentication,我的Flitter应用程序中有一个使用firebase身份验证的用户管理功能。我可以使用firebase\u auth的createUserWithEmailAndPassword()函数注册新用户帐户 return await FirebaseAuth.instance. createUserWithEmailAndPassword(email: email, password: password); 问题是注册成功后,即使我已登录,它也会自动将我的FirebaseAuth实例验证为

我的Flitter应用程序中有一个使用firebase身份验证的用户管理功能。我可以使用
firebase\u auth
createUserWithEmailAndPassword()函数注册新用户帐户

return await FirebaseAuth.instance.
    createUserWithEmailAndPassword(email: email, password: password);
问题是注册成功后,即使我已登录,它也会自动将我的
FirebaseAuth
实例验证为新用户。

我找到了这个答案:但它是用javascript编写的,并且有一个稍微不同的api


如何在dart中实现等效功能?

更新了
firebase\u core^0.5.0
firebase\u auth^0.18.0+1
已经弃用了adadion中共享的一些旧类

下面是为
firebase\u core^0.5.1
firebase\u auth^0.18.2
更新的代码

static Future<UserCredential> register(String email, String password) async {
    FirebaseApp app = await Firebase.initializeApp(
        name: 'Secondary', options: Firebase.app().options);
    try {
        UserCredential userCredential = await FirebaseAuth.instanceFor(app: app)
        .createUserWithEmailAndPassword(email: email, password: password);
    }
    on FirebaseAuthException catch (e) {
      // Do something with exception. This try/catch is here to make sure 
      // that even if the user creation fails, app.delete() runs, if is not, 
      // next time Firebase.initializeApp() will fail as the previous one was
      // not deleted.
    }
    
    await app.delete();
    return Future.sync(() => userCredential);
}
静态未来注册(字符串电子邮件、字符串密码)异步{
FirebaseApp app=等待Firebase.initializeApp(
名称:“次要”,选项:Firebase.app().options);
试一试{
UserCredential UserCredential=等待FirebaseAuth.instanceFor(应用程序:应用程序)
.createUserWithEmailAndPassword(电子邮件:电子邮件,密码:密码);
}
关于FireBaseAuth异常捕获(e){
//在异常情况下执行某些操作。此try/catch用于确保
//即使用户创建失败,app.delete()也会运行,如果不是,
//下一次Firebase.initializeApp()将失败,因为上一次失败
//没有删除。
}
等待app.delete();
返回Future.sync(()=>userCredential);
}

原始答案

我尝试了firebase身份验证api,目前的工作解决方案是:

// Deprecated as of `firebase_core ^0.5.0` and `firebase_auth ^0.18.0`.
// Use code above instead.

static Future<FirebaseUser> register(String email, String password) async {
    FirebaseApp app = await FirebaseApp.configure(
        name: 'Secondary', options: await FirebaseApp.instance.options);
    return FirebaseAuth.fromApp(app)
        .createUserWithEmailAndPassword(email: email, password: password);
}
//从'firebase\u core ^0.5.0'和'firebase\u auth ^0.18.0'起已弃用。
//改用上面的代码。
静态未来寄存器(字符串电子邮件、字符串密码)异步{
FirebaseApp app=等待FirebaseApp.configure(
名称:“次要”,选项:wait FirebaseApp.instance.options);
返回FirebaseAuth.fromApp(应用程序)
.createUserWithEmailAndPassword(电子邮件:电子邮件,密码:密码);
}
本质上,它归结为创建一个新的
FirebaseAuth实例
,这样从
createUserWithEmailAndPassword()自动登录不会影响默认实例。

基于此解决方案的我发布更新的代码

  Future signUpWithEmailPasswordAdminPastor(String email, String password, String role, String nama, String keuskupan, String kevikepan, String paroki) async {
try {

  FirebaseApp tempApp = await Firebase.initializeApp(name: 'temporaryregister', options: Firebase.app().options);

  UserCredential result = await FirebaseAuth.instanceFor(app: tempApp).createUserWithEmailAndPassword(
      email: email, password: password);

  // create a new document user for the user with uid
  await DatabaseService(uid: result.user.uid).updateUserDataSelf(
      true,
      role,
      nama,
      keuskupan,
      kevikepan,
      paroki,
      '',
      DateTime.now(),
      DateTime.now());

  tempApp.delete();
  return 'OK';
} catch (e) {
  print(e.toString());
  return null;
}
}

以上代码适用于
firebase\u核心:^0.5.0
firebase\u认证:^0.18.0+1

SwiftingDuster-创建“FirebaseApp”的软件包是什么?它似乎不是firebase_auth的一部分。它是firebase_core吗?是的,它是firebase_core的一部分
感谢您花时间澄清。这是书面的,但它看起来像是在全局“切换”firebase应用程序,所以当我再次登录时,我无法识别初始firebase应用程序上的onauthstatechanged。有没有办法将其从
辅助应用程序切换回来?我的使用案例是,我们在后台注册(通过您的流程),等待验证,然后登录。我们希望阻止他们在未经验证的情况下登录。由于您的
onAuthStateChanged
位于原始firebase auth实例上,因此您应该能够使用它登录:
FirebaseAuth.instance.signInWithEmailAndPassword()
。firebase auth中没有内置方式,只允许已验证的用户登录,因为默认行为是在注册时自动登录。我使用的解决方法是使用云函数代表使用AdminSDK的用户进行注册,然后为了进行验证,您可能需要存储它们是否被单独验证,就像在数据库中一样。