Правила безопасности и аутентификация Firebase

Firebase Security Rules обеспечивают контроль доступа и проверку данных в формате, поддерживающем несколько уровней сложности. Чтобы создать системы доступа на основе пользователей и ролей, обеспечивающие безопасность данных ваших пользователей, используйте Firebase Authentication с Firebase Security Rules .

Идентификация пользователей

Authentication идентифицирует пользователей, запрашивающих доступ к вашим данным, и предоставляет эту информацию в виде переменной, которую вы можете использовать в своих правилах. Переменная auth содержит следующую информацию:

  • uid : уникальный идентификатор пользователя, назначенный запрашивающему пользователю.
  • token : Карта значений, собранных с помощью Authentication .

Переменная auth.token содержит следующие значения:

Поле Описание
email Адрес электронной почты, связанный с учетной записью, если таковой имеется.
email_verified true , если пользователь подтвердил, что у него есть доступ к адресу email . Некоторые провайдеры автоматически проверяют принадлежащие им адреса электронной почты.
phone_number Номер телефона, связанный с учетной записью, если он присутствует.
name Отображаемое имя пользователя, если оно установлено.
sub UID пользователя Firebase. Это уникально в рамках проекта.
firebase.identities Словарь всех идентификаторов, связанных с учетной записью этого пользователя. Ключами словаря могут быть любые из следующих: email , phone , google.com , facebook.com , github.com , twitter.com . Значения словаря представляют собой массивы уникальных идентификаторов для каждого поставщика удостоверений, связанного с учетной записью. Например, auth.token.firebase.identities["google.com"][0] содержит первый идентификатор пользователя Google, связанный с учетной записью.
firebase.sign_in_provider Поставщик входа, использованный для получения этого токена. Может быть одной из следующих строк: custom , password , phone , anonymous , google.com , facebook.com , github.com , twitter.com .
firebase.tenant TenantId, связанный с учетной записью, если он присутствует. например, tenant2-m6tyz

Если вы хотите добавить настраиваемые атрибуты аутентификации, переменная auth.token также содержит все указанные вами пользовательские утверждения .

Если пользователь, запрашивающий доступ, не вошел в систему, переменная auth имеет null . Вы можете использовать это в своих правилах, если, например, хотите ограничить доступ на чтение для аутентифицированных пользователей — auth != null . Однако мы обычно рекомендуем дополнительно ограничить доступ для записи.

Дополнительные сведения о переменной auth см. в справочной документации Cloud Firestore , Realtime Database и Cloud Storage .

Используйте информацию о пользователях в правилах

На практике использование аутентифицированной информации в ваших правилах делает ваши правила более мощными и гибкими. Вы можете контролировать доступ к данным на основе личности пользователя.

В своих правилах определите, как информация в переменной auth — информация о пользователе запрашивающей стороны — соответствует информации о пользователе, связанной с запрошенными данными.

Например, ваше приложение может захотеть гарантировать, что пользователи смогут читать и записывать только свои собственные данные. В этом сценарии вам потребуется соответствие между переменной auth.uid и идентификатором пользователя в запрошенных данных:

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // Make sure the uid of the requesting user matches name of the user
    // document. The wildcard expression {userId} makes the userId variable
    // available in rules.
    match /users/{userId} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
  }
}

Realtime Database

{
  "rules": {
    "users": {
      "$userId": {
        // grants write access to the owner of this user account
        // whose uid must exactly match the key ($userId)
        ".write": "$userId === auth.uid"
      }
    }
  }
}

Cloud Storage

service firebase.storage {
  // Only a user can upload their file, but anyone can view it
  match /users/{userId}/{fileName} {
    allow read;
    allow write: if request.auth != null && request.auth.uid == userId;
  }
}

Определите пользовательскую информацию о пользователе

Вы также можете использовать переменную auth для определения настраиваемых полей, назначенных пользователям вашего приложения.

Например, предположим, что вы хотите создать роль «администратора», которая обеспечивает доступ для записи по определенным путям. Вы назначаете этот атрибут пользователям, а затем используете его в правилах, предоставляющих доступ к путям.

В Cloud Firestore вы можете добавить настраиваемое поле в документы пользователей и получить значение этого поля с помощью встроенного чтения в ваши правила. Итак, ваше правило на основе администратора будет выглядеть следующим образом:

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents/some_collection: {
    // Remember that, in Cloud Firestore, reads embedded in your rules are billed operations
    write: if request.auth != null && get(/databases/(database)/documents/users/$(request.auth.uid)).data.admin == true;
    read: if request.auth != null;
  }
}

Вы можете получить доступ к пользовательским утверждениям в Rules после создания пользовательских утверждений в Authentication . Затем вы можете ссылаться на эти пользовательские утверждения, используя переменную auth.token .

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // For attribute-based access control, check for an admin claim
    allow write: if request.auth.token.admin == true;
    allow read: true;

    // Alterntatively, for role-based access, assign specific roles to users
    match /some_collection/{document} {
     allow read: if request.auth.token.reader == "true";
     allow write: if request.auth.token.writer == "true";
   }
  }
}

Realtime Database

{
  "rules": {
    "some_path/$sub_path": {
      // Create a custom claim for the admin role
      ".write": "auth.uid !== null && auth.token.writer === true"
      ".read": "auth.uid !== null"
      }
    }
  }

Cloud Storage

service firebase.storage {
  // Create a custom claim for the admin role
  match /files/{fileName} {
    allow read: if request.auth.uid != null;
    allow write: if request.auth.token.admin == true;
  }
}

Дополнительные примеры основных Rules использующих Authentication , см. в разделе «Основные правила безопасности» .