DocumentReference вернуть конфиденциальные данные - Firestore - PullRequest
0 голосов
/ 11 января 2020

У меня есть коллекция "post" и "user", в Посте я прикрепил "userId" как ссылку на документ пользователя

Все отлично работает, кроме метода get (). Data () I вызов в почтовом документе предоставляет все конфиденциальные данные (которые я отправлю клиентам через Express сервер)

const ref = (await firestore.doc(...).get()).data()
  res.json({
    success: true,
    msg: ref,
  });

Вот что я получаю в переменной ref:

{
  "success": true,
  "msg": {
    "foo": "bar",
    "userId": {
      "_firestore": {
        "_settings": {
          "credentials": {
            "private_key": "-----BEGIN PRIVATE KEY---------END PRIVATE KEY-----\n", <--- Big problem
            "client_email": "..."
          },
          "projectId": "cpanel-9ac21",
          "firebaseVersion": "8.9.0",
          "libName": "gccl",
          "libVersion": "3.3.3 fire/8.9.0",
          "servicePath": "firestore.googleapis.com",
          "port": 443,
          "clientConfig": {},
          "scopes": [
            "https://www.googleapis.com/auth/cloud-platform",
            "https://www.googleapis.com/auth/datastore"
          ]
        },
        "_settingsFrozen": true,
        "_serializer": {},
        "_projectId": "cpanel-9ac21",
        "_lastSuccessfulRequest": 1578712168345,
        "_backoffSettings": {
          "initialDelayMs": 100,
          "maxDelayMs": 60000,
          "backoffFactor": 1.3
        },
        "_preferTransactions": false,
        "_clientPool": {
          "concurrentOperationLimit": 100,
          "maxIdleClients": 1,
          "activeClients": {},
          "terminated": false
        }
      },
      "_path": {
        "segments": [
          "users",
          "TXMF00S2PugwdwO5ge3vwQA6pV63"
        ]
      }
    },
    "foo": "bar"
  }
}

Я также искал на Inte rnet, но, к сожалению, не нашел ответа / решения

Ответы [ 2 ]

1 голос
/ 11 января 2020

В Firestore типичный способ отделить публичные c от личных данных - поместить их в разные коллекции. Итак, если у вас есть сообщение, и вам нужно разделить публичные c и личные данные, у вас может быть две коллекции: "posts-public / {id}" и "posts-private / {id}". Или вы можете использовать вложенные коллекции под одним и тем же идентификатором: "posts / {id} / publi c" и "posts / {id} / private".

После разделения коллекций вы также можете защитить они с различными правилами безопасности, которые разрешают доступ только к тому, что пользователь должен видеть. Если вы не хотите, чтобы пользователь вообще видел какие-либо личные данные, тогда эта коллекция просто не должна предоставлять доступ.

0 голосов
/ 26 января 2020

Я понял, так что в основном firestore вернет экземпляр DocumentReference. Все, что мне нужно, это преобразовать путь документа:

const purifyData = (data) => {
  const purifiedData = Object.keys(data).reduce((accumulator, prop) => {
    const propData = data[prop];
    if (propData instanceof firebase.firestore.DocumentReference) {
      accumulator[prop] = propData.path;
    } else {
      accumulator[prop] = propData;
    }

    return accumulator;
  }, {});

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