Firebase 身份验证颤动

Posted

技术标签:

【中文标题】Firebase 身份验证颤动【英文标题】:Firebase auth flutter 【发布时间】:2020-10-23 04:28:59 【问题描述】:

对于已登录的用户

 Future<String> signInWithGoogle() async 
        final GoogleSignInAccount googleSignInAccount = await googleSignIn.signIn();
        final GoogleSignInAuthentication googleSignInAuthentication =
        await googleSignInAccount.authentication;
    
        final AuthCredential credential = GoogleAuthProvider.getCredential(
          accessToken: googleSignInAuthentication.accessToken,
          idToken: googleSignInAuthentication.idToken,
        );
    
        final AuthResult authResult = await _auth.signInWithCredential(credential);
    
        final FirebaseUser user = authResult.user;
        assert(!user.isAnonymous);
        assert(await user.getIdToken() != null);
        final FirebaseUser currentUser = await _auth.currentUser();
        assert(user.uid == currentUser.uid);
        if(authResult.additionalUserInfo.isNewUser == true)
          InsertNewUserDetails(user.displayName,user.email,user.photoUrl,user.phoneNumber);
        
        if(authResult.user != null)
          email = user.email;
          name = user.displayName;
          imageUrl =user.photoUrl;
          globalInstance.isLoggedIn = true;
          print(globalInstance.isLoggedIn);
    
        
        return 'signInWithGoogle succeeded: $user';
      

第一次登录登录页面检查是否已登录帐户

class MyApp extends StatelessWidget 
  @override
  String strinbggg;
  Widget build(BuildContext context) 
    // TODO: implement build
    return MaterialApp(
      home: Scaffold(
        backgroundColor: Colors.teal,
        body: StreamBuilder<FirebaseUser>(
          stream: FirebaseAuth.instance.onAuthStateChanged,
          builder: (BuildContext context, snapshot) 
            if (snapshot.hasData && (!snapshot.data.isAnonymous)) 
//             return Text('$snapshot.hasData');
              return Homepage();
             else 
//              return SafeArea(
//                maintainBottomViewPadding: true,
//                  child: Text('aasdasdfasfdh : $snapshot.data.email',style: TextStyle(color: Colors.black54),));
              return LoginPage();
            
          ,
        ),
      ),
    );
  

当第一次使用谷歌登录时,它的工作原理。当我关闭应用程序并重新启动时,它会很好地重定向到主页,但用户个人资料详细信息(如 displayName 、电子邮件)返回空值

signInwithgoogle() 用于首次登录,将用户详细信息存储在 firestore 中,并从此处设置用户详细信息

MyApp 是应用程序的起点,将检查用户是否已登录

【问题讨论】:

能否请您在启动应用程序时显示您正在检查登录状态的代码? body: StreamBuilder( stream: FirebaseAuth.instance.onAuthStateChanged, builder: (BuildContext context, snapshot) if (snapshot.hasData && (!snapshot.data.isAnonymous)) // return Text('$snapshot.hasData'); return Homepage(); else // return SafeArea( // maintainBottomViewPadding: true, // child: Text('aasdasdfasfdh : $snapshot.data.email' ,style: TextStyle(color: Colors.black54),)); return LoginPage(); 这不是 google 登录的代码,它是一个用于处理签名状态的流,例如用户登录、用户退出等。从您的代码中,我可以假设您正在处理它以显示登录/主页。您需要检查用户是否已签名。 【参考方案1】:

我建议,你检查用户是否已经登录或没有使用该方法

bool isSignedIn = await _googleSignIn.isSignedIn();

如果用户已登录,则使用获取凭据

user = await _auth.currentUser();

当您启动应用程序时。如果您没有登录,请显示登录页面。任何示例都如下所示

final auth = FirebaseAuth.instance;

class MyApp extends StatelessWidget 
  @override
  String strinbggg;
  Widget build(BuildContext context) 

      return MaterialApp(
      home:  (_isSignedIn() == true ? new Homepage() : new LoginPage()));
   
   bool _isSignedIn() async 
      bool isSignedIn = await _googleSignIn.isSignedIn();
      if(isSignedIn)
          GoogleSignInAccount user = await auth.currentUser;
          //You can store this in your state.
     
      return !(user == null && auth.currentUser == null);
   

请注意,这是一个在编辑器中编写的代码,未经测试,您必须进行调整。

【讨论】:

您可以将您的流移动到主页内,这样当用户退出时,您可以重定向回登录

以上是关于Firebase 身份验证颤动的主要内容,如果未能解决你的问题,请参考以下文章

颤动的firebase身份验证提供者未通知

使用refreshToken颤动firebase自动刷新用户会话

如何针对 Firebase 验证身份验证令牌?

使用 Firebase 身份验证进行身份验证后检索 Google 访问令牌

使用firebase电话身份验证验证失败

Firebase 身份验证错误:未定义名称“身份验证”