将Firebase中的电子邮件域列入白名单

时间:2018-12-13 15:58:43

标签: swift xcode firebase

我目前正在创建一个针对大学生的iOS应用程序。为了安全起见,唯一的注册方法是使用他们的大学电子邮件(带有相应的电子邮件域)。但是,要做到这一点,我需要将特定的域列入白名单,以便诸如xxx@gmail.com之类的电子邮件无法注册/登录。

现在有两种方法可以执行此操作,首先,我需要在用户注册/登录时通过检查电子邮件文本字段是否包含适当的电子邮件域(即白名单)来创建一个if语句,然后我需要做的第二件事是设置firebase规则,以进行读写操作(如果auth用户拥有并以指定的白名单域结尾的电子邮件域)。

到目前为止,我已经可以针对一个电子邮件域执行此操作,但是如果我要针对100所学校,那么我的代码中就不能包含100条if语句(当然可以,但是效率很低)。因此,我希望有一种方法可以在我的Xcode项目中包括一个csv文件以供读取,以及具有可以读取firebase规则的cvs文件。如果不是这样的话。我希望可以创建电子邮件域的内部列表。

1 个答案:

答案 0 :(得分:1)

由于您希望将其列入白名单的域可能会随着时间而变化,因此我建议您在应用程序本身之外跟踪它们。例如,如果您使用Cloud Firestore,则可以保留列入白名单的域的集合。

domains:
    college.edu: {
       someinfo: true,
       // and so on
    },
    school.net: {
       someinfo: false,
       // etc
    }

然后,当用户想要注册时,而不是从客户端调用createUser,而是将请求正文中的信息传递给服务器端点。对于Cloud Functions,这将是一个很好的用例。 Cloud Functions在Node.js中可用,而不是Swift中可用,因此我的示例是用JS编写的。

exports.addMessage = functions.https.onCall((data, context) => {
  const domain = data.domain; // or you could regex the domain from the email. I just didn't feel like doing that here
  const email = data.email;
  const password = data.password;
  const domainRef = db.collection('domains').doc(domain);
  return domainRef.get()
    .then(doc => {
      if (!doc.exists) {
        console.log('No such document!');
      } else {
        console.log('Document data:', doc.data());
        admin.auth().createUser({
          email: email,
          password: password,
        })
        .then(function(userRecord) {
          // See the UserRecord reference doc for the contents of userRecord.
          console.log('Successfully created new user:', userRecord.uid);
          return {
            success: true
          };
        })
        .catch(function(error) {
          console.log('Error creating new user:', error);
          return {
            error: error
          };
        });
      }
    })
    .catch(err => {
      console.log('Error getting document', err);
      return {
        error: error
      };
    });
  });

在此示例中,我使用Firebase Admin Auth SDK创建一个新用户。