usuario users reglas indexon auth firebase firebase-security firebase-database firebase-realtime-database firebase-authentication

users - reglas firebase



¿Cómo puedo bloquear Firebase Database a cualquier usuario de un dominio específico(correo electrónico)? (5)

ADVERTENCIA: no confíes en esta respuesta. Solo aquí para discutir.

tldr: No creo que sea posible sin ejecutar su propio servidor.

Aquí está mi intento hasta ahora:

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

Creo que lo anterior dice "solo permite que las personas creen un nuevo usuario si están autenticadas por Google, están tratando de escribir en el nodo de la base de datos por sí mismos ( $user_id === auth.uid ) y su correo electrónico termina en foobar.com" .

Sin embargo, se señaló un problema: cualquier cliente web puede cambiar fácilmente su correo electrónico (usando la consola de desarrollo) antes de enviar el mensaje a Firebase. Por lo tanto, no podemos confiar en los datos de la entrada del usuario cuando se almacenan en Firebase.

Creo que lo único en lo que podemos confiar es en el objeto de auth en las reglas. Ese objeto de auth está poblado por el backend de Firebase. Y, desafortunadamente, el objeto de auth no incluye la dirección de correo electrónico.

Para el registro, estoy insertando mi usuario de esta manera:

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

Como puede imaginar, un usuario determinado podría sobrescribir el valor del email aquí (usando DevTools, por ejemplo).

Tengo una pequeña aplicación web personal de Firebase que usa Firebase Database. Quiero asegurar (bloquear) esta aplicación a cualquier usuario desde un único dominio específico. Quiero autenticarme con Google. No tengo claro cómo configurar las reglas para decir "solo los usuarios de un único dominio específico (digamos @foobar.com ) pueden leer y escribir en esta base de datos".

(Parte del problema que veo: es difícil arrancar una base de datos con suficiente información para que este caso de uso funcione. Necesito saber el correo electrónico del usuario en el momento de la autenticación, pero el objeto de auth no contiene correo electrónico. Parece que ser un problema de huevo de gallina, porque necesito escribir reglas de Firebase que se refieran a datos en la Base de Datos, pero esos datos aún no existen porque mi usuario no puede escribir en la base de datos).

Si auth tuviera correo electrónico, podría escribir las reglas fácilmente.

¡Gracias por adelantado!


Aquí está el código que funciona bien con mi base de datos, he establecido la regla de que solo los correos electrónicos de mi empresa pueden leer y escribir datos de mi base de datos Firebase.

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


Código que funciona para mí.

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


Para cualquiera que realmente no quiera tener cuentas no verificadas iniciando sesión. Tal vez sucio, pero muy efectivo.

Esta es mi solución (aplicación angular):

this.userService.login(this.email.value, this.password.value).then(data => { if (data.user.emailVerified === true) { //user is allowed } else { //user not allowed, log them out immediatly this.userService.logout(); } }).catch(error => console.log(error));


Si está utilizando la nueva Firebase, esto ahora es posible, ya que el email está disponible en las reglas de seguridad.

En las reglas de seguridad puede acceder tanto a la dirección de correo electrónico como a si está verificada, lo que hace posible algunos casos de uso excelentes. Con estas reglas, por ejemplo, solo un usuario autenticado y verificado de gmail puede escribir su perfil:

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

Puede ingresar estas reglas en la consola de Firebase Database de su proyecto.