【问题标题】:How to make Flutter authentification just over Firestore (without Firebase Auth)如何在 Firestore 上进行 Flutter 身份验证(没有 Firebase 身份验证)
【发布时间】:2020-10-21 01:48:22
【问题描述】:

我必须在不使用 Firebase 身份验证的情况下创建手动注册并通过 Firestore 登录。 这种要求的原因是当用户想要重置他的密码时,首先我必须在他的电子邮件地址上向他发送一个确认码(MD5),当他收到代码时,他应该输入新密码,他必须粘贴该代码。 我将通过电子邮件向他发送一个代码,同时,该代码也将在 Firestore 中,稍后我将对其进行比较(代码是否正确)。 最后,(如果输入的密码正确,他的新密码将覆盖他之前存储在文档中的密码)。文档以电子邮件地址命名,这意味着电子邮件应该是唯一的。

这是我用于注册的代码:

void onPressedRegister(BuildContext context, String fullName, String email,
String password, String phoneNumber, dynamic formKey) {
if (formKey.currentState.validate()) {
db.collection("firestoreUsers").document(email).setData({
  'fullName': fullName,
  'email': email,
  'password': password,
  'phoneNumber': phoneNumber
});

现在我在登录时遇到问题,因为我无法检查用户是否存储在数据库中。这是我写的:

Future<bool> signInOverFirestore(String email, String password) async {
db
    .collection('firestoreUsers')
    .where('email', isEqualTo: email)
    .getDocuments();
return true;
}

那么是否可以像这样登录并在以后从他的电子邮件中输入正确的代码时更新该用户?

【问题讨论】:

    标签: firebase flutter google-cloud-firestore


    【解决方案1】:

    如果您未将 Firebase 身份验证与 Firestore 和安全规则结合使用,则基本上不可能拥有安全的每用户数据。您现在拥有的是存储纯文本电子邮件地址和密码,以供世界上的每个人查看。只需使用 Firestore REST API 查询整个 firestoreUsers 集合即可查看所有内容。

    【讨论】:

    • 我明白了,但这是我的要求。但我坚持这一点。即使它只是一个明文,我也必须将它作为一个真正的凭据..
    • 我不知道您所说的“真正的凭据”是什么意思,但是您所做的事情一点也不安全。
    • “真实凭据”是指必须使用字段进行登录,而不涉及安全性。您对安全事实的解释完全可以理解,但目前,安全在另一个计划中。重点是通过 Firestore 建立登录和注册。
    • 您可以在文档中写入任何您想要的内容,并根据需要使用它。如果您在使用 api 时遇到特定问题,请编辑问题以说明未按您预期的方式工作。
    【解决方案2】:

    根据我的理解,您希望公开 Firestore 数据(无需身份验证即可访问/读取)检查是否某个文档具有值,如果该值不存在,您想创建一个新文档。为此,您可以尝试获取与您的价值(电子邮件)相等的文档并捕获错误或侦听是否成功。你可以通过下面的例子来完成它。

    _db
        .collection('path')
        .where('field', isEqualTo: '')
        .getDocuments()
        .then((value) {
      print('User on Firestore : $value');
    }).catchError((e) {
      print('Error no document found');
    });
    

    【讨论】:

    • 嗯,你已经接近答案了。我还获得了 QuerySnapshot 的实例(就像您的解决方案的价值一样),但问题是我不知道如何使用该屏幕上的用户输入检查 Firestore 的凭据。通常,使用firebase,我这样做: await _auth.signInWithEmailAndPassword(email: email, password: password);但 auth 是 Firebase 的实例。在这里,我不知道如何仅使用 Firestore -> 没有 FirebaseAuth。
    • 如果它尚不存在并且什么都不做(或更新)Firestore如果存在则记录。
    猜你喜欢
    • 2019-11-22
    • 2019-01-05
    • 2021-05-29
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 2017-03-11
    相关资源
    最近更新 更多