Flatter-Firebase与facebook的身份验证赢得';t将用户信息保存到数据库中

Flatter-Firebase与facebook的身份验证赢得';t将用户信息保存到数据库中,firebase,authentication,flutter,google-cloud-firestore,facebook-login,Firebase,Authentication,Flutter,Google Cloud Firestore,Facebook Login,我想让用户登录facebook并检查该用户是否已存在于数据库中。如果用户(uid)已存在,则应正常登录,但如果用户不在数据库中,则我想将该用户发送到创建帐户页面。这是我的代码,但不起作用。这允许用户登录,但不从用户配置文件中获取任何数据,我能做什么? //Login with Facebook void signInUsingFacebook() async { final FacebookLogin facebookLogin = FacebookLogin(); fi

我想让用户登录facebook并检查该用户是否已存在于数据库中。如果用户(uid)已存在,则应正常登录,但如果用户不在数据库中,则我想将该用户发送到创建帐户页面。这是我的代码,但不起作用。这允许用户登录,但不从用户配置文件中获取任何数据,我能做什么?

  //Login with Facebook
  void signInUsingFacebook() async {
    final FacebookLogin facebookLogin = FacebookLogin();
    final FacebookLoginResult facebookLoginResult =
        await facebookLogin.logIn(['email']);
    switch (facebookLoginResult.status) {
      case FacebookLoginStatus.loggedIn:
        // TODO: Handle this case.
        FirebaseAuth.instance.signInWithCredential(
          FacebookAuthProvider.getCredential(
              accessToken: facebookLoginResult.accessToken.token),
        );
        FirebaseUser currentUser = await FirebaseAuth.instance.currentUser();
        if (currentUser != null) {
          print('user is logged in');
          await _pushNotificationService.initialise();

          final DocumentSnapshot doc =
              await usersRef.document(currentUser.uid).get();
          //Storing the user data in the firestore database

          if (!doc.exists) {
            final userDetails = await Navigator.push(context,
                MaterialPageRoute(builder: (context) => CreateAccount()));
            _db.collection("users").document(currentUser.uid).setData({
              "username": userDetails[1],
              "displayName": userDetails[2],
              "email": currentUser.email,
              "photUrl": userDetails[0],
              "gender": userDetails[3],
              "timestamp": timestamp,
              "signin_method": currentUser.providerId,
              "location": userDetails[4],
              "uid": currentUser.uid,
              "points": 0,
              "bio": userDetails[5],
            });
          }
        }
        break;
      case FacebookLoginStatus.cancelledByUser:
        // TODO: Handle this case.
        print('cancelled by user');
        break;
      case FacebookLoginStatus.error:
        // TODO: Handle this case.
        print('login error');
        break;
    }


我差点忘了这个问题。我终于解决了如何让它正常工作,所以我将下面的代码发布给任何想使用它的人。希望有帮助

  //Login with Facebook
  void signInUsingFacebook() async {
    final FacebookLogin facebookLogin = FacebookLogin();
    final FacebookLoginResult facebookLoginResult =
        await facebookLogin.logIn(['email']);
    switch (facebookLoginResult.status) {
      case FacebookLoginStatus.loggedIn:
        setState(() {
          showSpinner = true;
        });
        // TODO: Handle this case.
        FirebaseAuth.instance
            .signInWithCredential(
          FacebookAuthProvider.getCredential(
              accessToken: facebookLoginResult.accessToken.token),
        )
            .then((user) async {
          await _pushNotificationService.initialise();
          final graphResponse = await http.get(
              'https://graph.facebook.com/v2.12/me?fields=name,picture,email&access_token=${facebookLoginResult.accessToken.token}');
          final profile = JSON.jsonDecode(graphResponse.body);

          final DocumentSnapshot doc =
              await usersRef.document(user.user.uid).get();
          //Storing the user data in the firestore database

          if (!doc.exists) {
            final userDetails = await Navigator.push(
                context, MaterialPageRoute(builder: (ctx) => CreateAccount()));

            _db.collection("users").document(user.user.uid).setData({
              "username": userDetails[0],
              "displayName": userDetails[1],
              "email": profile['email'],
              "photUrl": "N/A",
              "gender": userDetails[2],
              "timestamp": timestamp,
              "signin_method": 'Facebook',
              "location": userDetails[4],
              "uid": user.user.uid,
              "points": 0,
              "bio": userDetails[3],
            });
          }
          setState(() {
            showSpinner = false;
          });
          Navigator.pushReplacement(
            context,
            MaterialPageRoute(
              builder: (context) => UserProfile(),
            ),
          );
        });

        break;
      case FacebookLoginStatus.cancelledByUser:
        // TODO: Handle this case.
        setState(() {
          showSpinner = false;
        });

        break;
      case FacebookLoginStatus.error:
        // TODO: Handle this case.
        setState(() {
          showSpinner = false;
        });

        break;
    }
  }

说明: 问答代码的主要区别在于这一部分:

// TODO: Handle this case.
        FirebaseAuth.instance
            .signInWithCredential(
          FacebookAuthProvider.getCredential(
              accessToken: facebookLoginResult.accessToken.token),
        ).then((user))async{}
首先获取当前用户对象,然后尝试获取当前用户的accesstoken在当前版本的Flatter_facebook_登录包上不起作用。 您必须使用
FirebaseAuth.instance.signInWithCredential()
方法并使用
FacebooAuthProvider().getCredential(accessToken:)
这将允许firebase使用凭据登录并返回当前用户对象。现在,您可以使用当前用户对象将详细信息存储到firestore数据库

注意:Facebook以JSON格式返回用户详细信息。因此,您必须先解码JSON数据,然后才能使用它。解码JSON数据的代码如下:

final graphResponse = await http.get(
              'https://graph.facebook.com/v2.12/me?fields=name,picture,email&access_token=${facebookLoginResult.accessToken.token}');
          final profile = JSON.jsonDecode(graphResponse.body);

希望这会有所帮助!干杯

虽然这段代码可能会解决这个问题,但如何以及为什么解决这个问题将真正有助于提高您的帖子质量,并可能导致更多的投票。请记住,你是在将来回答读者的问题,而不仅仅是现在提问的人。请在回答中添加解释,并说明适用的限制和假设。感谢您指出这一点。我肯定会在这段代码后面添加解释。