【问题标题】:How to check whether the user email id exists?如何检查用户电子邮件ID是否存在?
【发布时间】:2021-03-12 06:02:10
【问题描述】:

我正在使用以下代码在带有 firebase 的 Flutter 应用程序中使用 Google 登录,该代码运行成功。

我应该如何检查使用的电子邮件ID是否已经存在于firebase身份验证中?

我需要确保我相应地更新了 firestore 数据库中的用户信息。

Future<User> _handleSignIn() async {

    User user;
    bool userSignedIn = await _googleSignIn.isSignedIn();  

    setState(() {
      isUserSignedIn = userSignedIn;
    });

    if (isUserSignedIn) {
      user = _auth.currentUser;
    }
    else {
      final GoogleSignInAccount googleUser = await _googleSignIn.signIn();
      final GoogleSignInAuthentication googleAuth = await googleUser.authentication;

      final AuthCredential credential = GoogleAuthProvider.credential(
        accessToken: googleAuth.accessToken,
        idToken: googleAuth.idToken,
      );

      user = (await _auth.signInWithCredential(credential)).user;
      userSignedIn = await _googleSignIn.isSignedIn();
      setState(() {
        isUserSignedIn = userSignedIn;
      });
    }

    return user;
  }

请指导我

【问题讨论】:

  • 这能回答你的问题吗? Check if given email exists
  • 登录后是否要在firestore中制作用户文档或数据
  • @ArpitPorwal,不,它不回答我的问题,因为它仅与 Android 有关,我正在使用 Flutter 应用程序
  • @Yashirkhan 是的,我想根据谷歌登录电子邮件 ID 是否已经存在来制作用户文档/更新数据

标签: firebase flutter firebase-authentication google-signin


【解决方案1】:

有一个 与 Firebase 身份验证相关的通用异常。 这是类 FirebaseAuthException。它带有与错误相关的代码,包括已经存在的电子邮件,因此您可以编写如下内容:

try {
 //your signIn method here
//i assumed handleSignIn
handleSignIn();
 
} on FirebaseAuthException catch (e) {
   //exception that occurs if e-mail already exists
   if (e.code == 'email-already-in-use') {
    // the rest of your code here
  }
} 

【讨论】:

  • 对不起,费迪南德,我尝试了上述解决方案,但没有解决目的
【解决方案2】:

那么这就是我用来解决问题的方法

这是我的 auth.dart 文件

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:gfd_official/User/User.dart';
import 'package:gfd_official/services/database.dart';
import 'package:google_sign_in/google_sign_in.dart';

String photoUrl;

class AuthService {
   final FirebaseAuth _auth = FirebaseAuth.instance;

 // create user obj based on firebase user
Userdat _userFromFirebaseUser(User user) {
return user != null ? Userdat(uid: user.uid) : null;
}

// auth change user stream
 Stream<Userdat> get user {
  return _auth
    .authStateChanges()
    //.map((FirebaseUser user) => _userFromFirebaseUser(user));
    .map(_userFromFirebaseUser);
  }

Future signInWithGoogle() async {
  GoogleSignIn googleSignIn = GoogleSignIn();
  final acc = await googleSignIn.signIn();
  final auth = await acc.authentication;
  final credential = GoogleAuthProvider.credential(
    accessToken: auth.accessToken, idToken: auth.idToken);
try {
  final res = await _auth.signInWithCredential(credential);
  User user = res.user;
  photoUrl = user.photoURL;
  UserHelper.saveUser(user);
  return _userFromFirebaseUser(user);
} catch (e) {
  print(e.toString());
  return null;
}
}

Future logOut() {
try {
  GoogleSignIn().signOut();
  return _auth.signOut();
 } catch (e) {
  print(e.toString());
  return null;
}
}
}

class UserHelper {
  static FirebaseFirestore _db = FirebaseFirestore.instance;

 static saveUser(User user) async {
   Map<String, dynamic> userData = {
   "name": user.displayName,
   "email": user.email,
   "role": "basic",
  };
  try {
  final userRef = _db.collection("users").doc(user.uid);
  if ((await userRef.get()).exists) {
    await userRef.update({});
  } else {
    await _db
        .collection("users")
        .doc(user.uid)
        .set(userData, SetOptions(merge: true));
  }
} catch (e) {
  print(e.toString());
}
}
}

在此保存用户功能将为新用户创建数据库,如果用户已经存在,那么它将使其保持原样。 我正在使用他/她的 uid 为每个用户创建一个文档。

【讨论】:

  • Yasir 感谢这个答案,但它不会使用set 方法重写相同的记录吗??
  • 别担心它会起作用,你必须尝试,因为它会检查用户是否有数据,如果有,它不会对数据做任何事情,如果没有,它会获取相同的数据,然后它会创建一个新的用户的文档,并且由于合并为真,它不会引起任何问题。
  • 是的,我试过了,但它对我不起作用,然后我尝试了解决问题的其他方法
  • 嘿,太好了,请告诉我其他方法。
猜你喜欢
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 2013-01-05
相关资源
最近更新 更多