flutter - Firebase firestore obtiene el documento de usuario sin autenticar

CorePress2024-01-24  7

Estaba intentando crear una aplicación en flutter con firebase. No quiero que el usuario lo autentique en la autenticación de Firebase.

Todo lo que quiero es que utilicen su número de teléfono como código secreto. Lo que significa que puede ingresar el número de teléfono para ver sus datos sin autenticación. Sin número de teléfono, no pueden leer los datos (sin OTP tampoco).

Ahora tengo esto en la regla de Firestore, por lo que cualquiera que tenga el número de teléfono puede ver los datos.

 function isUserRef(field) { 
  return field in resource.data
    && resource.data.mobile == /customers/document/$(request.resource.data.mobile)
}

match /customers/{document=**} {
  allow read : if isUserRef(request.resource.data.mobile);
}

los datos de recursos de la solicitud contienen lo siguiente.

User{
"id" : null,
"mobile" : "7878445778"
}

Pero la regla anterior aún no coincide con el documento según su número de móvil. No quiero que el usuario se autentique en absoluto. Es una aplicación sencilla donde los datos no son una preocupación.

¡¡Cualquier ayuda se agradece!!. Gracias.

¿Qué datos estás almacenando para un usuario? ¿Cómo te aseguras de que otras personas no puedan acceder a sus datos dándote su número de teléfono?

- Maestro de niebla

27/03/2021 a las 10:39



------------------------------------

No está claro cómo está configurada su base de datos o cómo pasa el número de teléfono, pero aquí hay un método más sencillo que puede ayudarle.

Configura tu base de datos donde el número de teléfono sea el ID del cliente. Si eso no es posibleible, cree una colección phoneToCustomers que se utilice para relacionar números de teléfono con clientes.

Ejemplo 1: números de teléfono como ID de cliente

Supongamos que sus ID de cliente son sus números de teléfono:

{
  "customers": {
    "7878445778": {...},
    "1231231234": {...}
  }
}

Con esta sencilla regla podrás lograr lo que quieras:

match /customers/{phone} {

  // Allow anyone with the phone number to access this document
  allow get: if true;

  // Can't list all customers
  allow list: if false;
}
Ejemplo 2: tabla de búsqueda de ID de cliente

Supongamos que su base de datos tiene este aspecto:

{
  "customers": {
    "abc123": {...},
    "xyz987": {...}
  },
  "phoneToCustomers": {
    "7878445778": "abc123",
    "1231231234": "xyz987"
  }
}

Estas reglas impiden que los usuarios consulten a sus clientes o números de teléfono, pero permiten recuperar documentos si el usuario conoce el ID.

match /customers/{customerId} {

  // Allow anyone with the customer ID to access this document
  allow get: if true;

  // Can't list all customers
  allow list: if false;
}

match /phoneToCustomers/{phone} {

  // Allow anyone with the phone number to access this document
  allow get: if true;

  // Can't list all customers
  allow list: if false;
}

Luego necesitaría get() /phoneToCustomers/7878445778 para obtener el ID del cliente y luego un segundo get() para recuperar los datos del cliente en /customers/<customerId>.

3

¡Gracias! Por cierto, esto me hace pensar en la dirección correcta, pero no estoy seguro de cómo reemplazar la clave que contiene los datos. Significado Usuario(id:null, mobile:989898989); ¿Cómo configuro la clave como número de móvil?.

-EngineSense

27/03/2021 a las 17:12

¡¡Ahh!!, déjame probar esa primera opción y te cuento el resultado.

-EngineSense

27/03/2021 a las 17:49

@EngineSense una tercera opción si no puede implementar esa estructura de datos simple sería crear una función en la nube que acepte un número de teléfono, consulte la base de datos y devuelva el registro.

- Brian Burton

28 de marzo de 2021 a las 6:03



------------------------------------

Para evaluar las solicitudes entrantes con respecto a otros documentos en la base de datos, puede utilizar la solicitud get() o exist(), que esperan una ruta de documento completamente especificada.

Tenga en cuenta que las funciones tienen acceso a variableses, que se definen en el ámbito donde usted los define.

Esta función comprueba si existe el documento nombrado como número de teléfono del usuario:

function isUser(request) { 
  let requestData = request.resource.data.mobile;
  let docExists = exists(/databases/$(database)/documents/customers/$(requestData)); 
return docExists;

Esta función comprueba si el documento tiene un campo con el número de teléfono del usuario:

function isUser(document, request) {
  let requestData = request.resource.data.mobile;
  let fieldExists = get(/databases/$(database)/documents/customers/$(document)).data.mobile == requestData;
return fieldExists;

Este caso de uso, como puede ver, también requiere que se pase un comodín de documento para funcionar.

Con la primera función tus reglas de seguridad serán:

match /customers/{document} {
  allow read : if isUser(request);
}

Con la segunda función tus reglas de seguridad serán:

match /customers/{document} {
  allow read : if isUser(document, request);
}

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare