Catch up on highlights from Firebase at Google I/O 2023. Learn more

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

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

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

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

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

Переменная 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 и идентификатором пользователя в запрошенных данных:

Облако 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;
    }
  }
}

База данных реального времени

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

Облачное хранилище

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 для определения настраиваемых полей, назначенных пользователям вашего приложения.

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

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

Облако 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;
  }
}

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

Облако 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";
   }
  }
}

База данных реального времени

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

Облачное хранилище

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

Дополнительные примеры базовых правил, использующих аутентификацию, см. в разделе Основные правила безопасности .