如何将Firebase数据库locking到特定(电子邮件)域中的任何用户?

我有一个使用Firebase数据库的小型个人Firebase Web应用程序。 我想要保护(locking)这个应用程序从一个单一的,特定的域的任何用户。 我想与Google进行身份validation。 我不清楚如何configuration规则来说“只有来自单个特定域(比如@foobar.com )的用户才能读取和写入这个数据库”。

(我看到的一部分问题:很难用足够的信息来启动一个数据库来使这个用例工作,在authentication的时候我需要知道用户的电子邮件,但是auth对象不包含email。是一个鸡蛋问题,因为我需要编写引用数据库中的数据的Firebase规则,但由于我的用户无法写入数据库,所以数据还不存在。

如果auth有电子邮件,那么我可以很容易地编写规则。

提前致谢!

如果您使用的是新的Firebase,则现在可以使用该function,因为email在安全规则中可用。

在安全规则中,您可以同时访问电子邮件地址以及是否validation,这使得一些很好的用例成为可能。 以这些规则为例,只有经过validation的,经过validation的gmail用户可以编写他们的configuration文件:

 { "rules": { ".read": "auth != null", "gmailUsers": { "$uid": { ".write": "auth.token.email_verified == true && auth.token.email.matches(/.*@gmail.com$/)" } } } } 

您可以在项目的Firebase数据库控制台中input这些规则。

警告:不要相信这个答案。 就在这里讨论。

tldr:我不认为这是可能的,没有运行你自己的服务器。

这是我迄今的尝试:

 { "rules": { ".read": "auth.provider === 'google' && root.child('users').child(auth.uid).child('email').val().endsWith('@foobar.com')", ".write": "auth.provider === 'google' && root.child('users').child(auth.uid).child('email').val().endsWith('@foobar.com')", "users": { "$user_id": { ".write": "auth.provider === 'google' && $user_id === auth.uid && newData.child('email').val().endsWith('@foobar.com')" } } } } 

我相信上面说的“只允许人们创build一个新的用户,如果他们通过谷歌authentication,正试图写入数据库节点为themselve( $user_id === auth.uid ),他们的电子邮件结束于foobar.com” 。

但是,有一个问题被指出:任何Web客户端都可以在将邮件发送到Firebase之前轻松更改其电子邮件(使用开发控制台)。 因此,我们无法在存储到Firebase时信任用户条目的数据。

我认为唯一可以信任的是规则中的auth对象。 该auth对象由Firebase的后端填充。 而且,不幸的是, auth对象不包含电子邮件地址。

为了logging,我以这种方式插入我的用户:

 function authDataCallback(authData) { if (authData) { console.log("User " + authData.uid + " is logged in with " + authData.provider + " and has displayName " + authData.google.displayName); // save the user's profile into the database so we can list users, // use them in Security and Firebase Rules, and show profiles ref.child("users").child(authData.uid).set({ provider: authData.provider, name: getName(authData), email: authData.google.email }); 

正如您所能想象的那样,确定的用户可以在这里覆盖email的价值(例如使用DevTools)。

这里是我的数据库工作正常的代码,我已经设置规则,只有我公司的电子邮件可以读取和写入我的firebase数据库的数据。

 { "rules": { ".read": "auth.token.email.matches(/.*@yourcompany.com$/)", ".write": "auth.token.email.matches(/.*@yourcompany.com$/)" } } 

代码正在为我工​​作。

 export class AuthenticationService { user: Observable<firebase.User>; constructor(public afAuth: AngularFireAuth) { this.user = afAuth.authState; } login(){ var provider = new firebase.auth.GoogleAuthProvider(); provider.setCustomParameters({'hd': '<your domain>'}); this.afAuth.auth.signInWithPopup(provider) .then(response => { let token = response.credential.accessToken; //Your code. Token is now available. }) } }