Как заблокировать базу данных Firebase любому пользователю из определенного (электронной почты) домена?

У меня есть небольшой персональный Firebase webapp, который использует Firebase Database. Я хочу защитить (заблокировать) это приложение для любого пользователя из одного конкретного домена. Я хочу выполнить проверку подлинности с помощью Google. Я не понимаю, как настроить правила, чтобы сказать: «Только пользователи из одного конкретного домена (скажем, @foobar.com ) могут читать и записывать в эту базу данных».

(Часть проблемы, которую я вижу: трудно загружать базу данных с достаточной информацией, чтобы сделать эту работу использования. Мне нужно знать адрес электронной почты пользователя во время аутентификации, но auth объект не содержит электронной почты. быть проблемой куриного яйца, потому что мне нужно написать правила Firebase, которые относятся к данным в базе данных, но эти данные еще не существуют, потому что мой пользователь не может писать в базу данных.)

Если у auth была электронная почта, тогда я мог бы написать правила легко.

Заранее спасибо!

Если вы используете новую Firebase, теперь это возможно, так как email доступна в правилах безопасности.

В правилах безопасности вы можете получить доступ как к адресу электронной почты, так и к проверке, что делает возможными некоторые возможные варианты использования. С помощью этих правил, например, только аутентифицированный, проверенный пользователь Gmail может написать свой профиль:

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

Вы можете ввести эти правила в консоли базы данных Firebase вашего проекта.

ПРЕДУПРЕЖДЕНИЕ: не доверяйте этому ответу. Просто здесь для обсуждения.

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')" } } } } 

Я считаю, что вышеизложенное говорит, что «разрешить людям создавать нового пользователя, если они аутентифицированы Google, пытаются записать в узел базы данных для themselve ( $user_id === auth.uid ), а их адрес электронной почты заканчивается на foobar.com” ,

Однако была отмечена проблема: любой веб-клиент может легко изменить свою электронную почту (используя консоль dev) до того, как сообщение будет отправлено в Firebase. Поэтому мы не можем доверять данным пользовательской записи при их хранении в Firebase.

Я думаю, что единственное, на что мы можем доверять, – это объект auth в правилах. Этот объект auth заselenium бэкэндом Firebase. И, к сожалению, объект auth не включает адрес электронной почты.

Для записи я вставляю своего пользователя таким образом:

 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; constructor(public afAuth: AngularFireAuth) { this.user = afAuth.authState; } login(){ var provider = new firebase.auth.GoogleAuthProvider(); provider.setCustomParameters({'hd': ''}); this.afAuth.auth.signInWithPopup(provider) .then(response => { let token = response.credential.accessToken; //Your code. Token is now available. }) } } 
  • Firebase: запрос для исключения данных на основе условия
  • Firebase runTransaction не работает - MutableData имеет значение null
  • Как отключить запись в Firebase 3.x
  • Как отсортировать записи Firebase по двум полям (Android)
  • Firebase: различия между базой данных в реальном времени и хранением файлов
  • Как найти значение в firebase Android
  • Как отделить начальную нагрузку от инкрементальных детей с Firebase?
  • Почему я не могу использовать метод overulateViewHolder override?
  • При создании POJO в Firebase вы можете использовать ServerValue.TIMESTAMP?
  • Как получить объект списка из firebase в android
  • Доступ к данным db в облачных функциях для Firebase
  • Давайте будем гением компьютера.