Catch up on everthing we announced at this year's Firebase Summit. 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 .

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

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

Для получения дополнительной информации о auth переменном, см справочной документации для облачных Firestore , в реальное время базов данных и 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;
    }
  }
}

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

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

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

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

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

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

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

Чтобы увидеть больше примеров основных правил Усиливая проверки подлинности см Правила Основы безопасности .