Правила безопасности и аутентификация 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 Идентификатор пользователя 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;
  }
}

После создания пользовательских заявок в Authentication вы можете получить доступ к пользовательским заявкам в Rules . Затем вы можете ссылаться на эти заявки, используя переменную 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 , см. в разделе Базовые правила безопасности .