我目前正在创建一个针对大学生的iOS应用程序。为了安全起见,唯一的注册方法是使用他们的大学电子邮件(带有相应的电子邮件域)。但是,要做到这一点,我需要将特定的域列入白名单,以便诸如xxx@gmail.com之类的电子邮件无法注册/登录。
现在有两种方法可以执行此操作,首先,我需要在用户注册/登录时通过检查电子邮件文本字段是否包含适当的电子邮件域(即白名单)来创建一个if语句,然后我需要做的第二件事是设置firebase规则,以进行读写操作(如果auth用户拥有并以指定的白名单域结尾的电子邮件域)。
到目前为止,我已经可以针对一个电子邮件域执行此操作,但是如果我要针对100所学校,那么我的代码中就不能包含100条if语句(当然可以,但是效率很低)。因此,我希望有一种方法可以在我的Xcode项目中包括一个csv文件以供读取,以及具有可以读取firebase规则的cvs文件。如果不是这样的话。我希望可以创建电子邮件域的内部列表。
答案 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创建一个新用户。