firebase - Flutter - 使用 facebook 的 Firebase 身份验证不会将用户信息保存到数据库中

标签 firebase authentication flutter google-cloud-firestore facebook-login

我想让用户使用 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{}

首先获取当前用户对象,然后尝试获取该当前用户的访问 token 不适用于当前版本的 flutter_facebook_login 包。 您必须使用 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);

希望对您有所帮助!干杯

关于firebase - Flutter - 使用 facebook 的 Firebase 身份验证不会将用户信息保存到数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61448942/

相关文章:

java - 如何将多种类型的用户重定向到各自的 Activity?

flutter - 如何在 Flutter 中使用 ScopedModel 时保留数据?

ios - Swift 中字典对象的 Firebase 实时问题

node.js - 如何仅使用firebase进行身份验证并使用nodejs作为后端?

android - Android 登录后返回按钮(重新输入问题)

java - 使用 Windows session 凭据作为登录?它是如何工作的??

javascript - 非 200 时 Angular 没有得到响应

user-interface - 如何在flutter for web中使用 'tab'在控件之间跳转?

dart - 如何将 flutter BLoC 流快照转换为自定义对象?

javascript - 如何动态地将函数数组添加到javascript函数中?