Обнаружение аутентифицированных пользователей в правилах безопасности Firestore при использовании файлов cookie cookie Firebase - PullRequest
0 голосов
/ 23 апреля 2020

Здесь есть небольшая проблема с правилами безопасности Firestore. У меня есть React / Redux SPA с пользовательским API, использующим Firebase и Firestore.

В настоящее время я использую куки сессии, как описано в официальной документации Firebase (https://firebase.google.com/docs/auth/admin/manage-cookies). Поэтому, когда я вхожу в систему, cook ie устанавливается и отправляется с последующими запросами к API, никаких проблем с этим нет.

Но теперь, когда я вошел в систему с системой session cook ie правила Firestore не позволяют мне читать или записывать данные с ошибкой «отказано в разрешении», поскольку объект request.auth запроса Firestore больше не устанавливается с сеансом cook ie system ...

Как я могу определить, прошла ли аутентификация пользователя с помощью Cook Cooking ie в моих правилах безопасности Firestore?

маршрут входа в мой внешний API Firebase с использованием сеанса Cook ie:

login(req, res) {
auth.setPersistence(firebase.auth.Auth.Persistence.NONE);
auth.signInWithEmailAndPassword(req.query.email, req.query.password)
  .then((response) => response.user.getIdToken().then((idToken) => {
    const expiresIn = 60 * 15 * 1000;
    admin.auth().createSessionCookie(idToken, { expiresIn })
      .then((sessionCookie) => {
        const options = { maxAge: expiresIn, httpOnly: true, secure: !!process.env.NODE_ENV === 'production' };
        res.cookie('session', sessionCookie, options);
        auth.signOut();
        res.json(response);
      }, () => {
        res.status(401).write('Error while verifying token.');
      });
  })).catch((err) => {
    console.error(err);
  });
},

basi c пользователь получает в том же API с помощью Firestore; вызывается сразу после входа в систему с параметром cook ie, установленным в заголовке запроса:

get(req, res) {
  const { uid } = req;
  db.collection('users').doc(uid).get().then((doc) => {
    res.json(doc.data());
  })
  .catch((err) => {
    console.log(req.path);
    console.error(err);
    res.json(err);
  });
},

ошибка отклонена из правил безопасности Firestore:

Error [FirebaseError]: Missing or insufficient permissions.

старые правила безопасности Firestore, с которыми мне нужно работать:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    function isSignedIn() {
      return request.auth != null;
    }
    match /users/{userId} {
      allow create, update, get: if isSignedIn();
    }
    match /medic/{medicId} {
      allow create, read: if isSignedIn();
    }
  }
}

Большое спасибо!

1 Ответ

0 голосов
/ 23 апреля 2020

Хорошо, поэтому я нашел решение здесь. Я не использую Firebase Admin SDK в своем серверном API, поэтому правила безопасности Firestore проверяются, поскольку система считает, что это запрос на стороне клиента.

Я должен ограничить все операции в безопасности Firestore правила, а затем используйте Firebase Admin SDK для выполнения операций с моей базой данных в API (, очевидно, мне нужно самому проверить данные и аутентификацию, поскольку правила безопасности Firestore больше не используются ; но это уже так, благодаря Повар сеанса Firebase ie)

По мере углубленного изучения правил безопасности вы обнаружите, что запросы из Firebase Admin SDK не регулируются правилами. Admin SDK инициализируется с учетной записью службы, которая дает SDK полный доступ к вашим данным. В базе данных Firebase Realtime вы можете ограничить привилегии Admin SDK идентификатором пользователя и применять правила как обычно. Но другие продукты, особенно Google Cloud Firestore, пока не поддерживают эту функцию. Об этом следует помнить при реализации операций доступа к данным на стороне сервера.

см .: https://firebase.googleblog.com/2019/03/firebase-security-rules-admin-sdk-tips.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...