Come posso bloccare Firebase Database a qualsiasi utente da un dominio (email) specifico?

Ho una piccola webapp Firebase personale che utilizza Firebase Database. Voglio proteggere (bloccare) questa app per qualsiasi utente da un singolo dominio specifico. Voglio autenticarsi con Google. Non sono chiaro come configurare le regole per dire “solo gli utenti di un singolo dominio specifico (ad esempio @foobar.com ) possono leggere e scrivere su questo database”.

(Parte del problema che vedo: è difficile riavviare un Database con informazioni sufficienti per far funzionare questo caso. Devo conoscere l’email dell’utente al momento dell’autenticazione, ma l’object auth non contiene email. essere un problema di uovo di gallina, perché ho bisogno di scrivere le regole di Firebase che fanno riferimento ai dati nel database, ma quei dati non esistono ancora perché il mio utente non può scrivere nel database.)

Se auth avesse l’email, potrei scrivere facilmente le regole.

Grazie in anticipo!

Se stai usando il nuovo Firebase, questo è ora ansible, dal momento che l’ emailemail è disponibile nelle regole di sicurezza.

Nelle regole di sicurezza è ansible accedere sia all’indirizzo email sia al fatto che sia verificato, il che rende possibili grandi casi d’uso. Con queste regole, ad esempio, solo un utente gmail autenticato e verificato può scrivere il proprio profilo:

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

Puoi inserire queste regole nella console del database Firebase del tuo progetto.

ATTENZIONE: non fidarti di questa risposta. Sono qui solo per la discussione.

tldr: Non penso sia ansible, senza il tuo server.

Ecco il mio tentativo finora:

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

Credo che quanto detto sopra “consente alle persone di creare un nuovo utente solo se sono autenticati da Google, stanno cercando di scrivere nel nodo del database per se stessi ( $user_id === auth.uid ) e la loro posta elettronica termina su foobar.com” .

Tuttavia, è stato segnalato un problema: qualsiasi client Web può facilmente modificare la propria posta elettronica (utilizzando la console di sviluppo) prima che il messaggio venga inviato a Firebase. Quindi non possiamo fidarci dei dati della voce dell’utente quando vengono archiviati in Firebase.

Penso che l’unica cosa di cui possiamo davvero fidarci è l’object auth nelle regole. auth è popolato dal backend di Firebase. E, sfortunatamente, l’object auth non include l’indirizzo email.

Per la cronaca, sto inserendo il mio utente in questo modo:

 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 }); 

Come potresti immaginare, un utente determinato potrebbe sovrascrivere il valore email qui (utilizzando DevTools, ad esempio).

Ecco il codice che funziona bene con il mio database, ho stabilito che solo le email della mia azienda possono leggere e scrivere i dati del mio database Firebase.

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

Codice che funziona per me.

 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. }) } }