Как создать документ в Firestore с надежными временными метками? - PullRequest
0 голосов
/ 23 марта 2019

Каким образом временные метки пожарного хранилища считаются действительными из клиентского SDK, если их нельзя установить на самом сервере пожарного хранилища?

Не правда ли, что аутентифицированный пользователь может взломать свои собственные метки времени? Какой смысл клиенту sdk предлагать тип данных временной метки, если они не могут быть надежными? Означает ли это, что мы должны использовать Firebase Admin SDK для создания пользовательских данных при регистрации или чего-то еще, что требует отметки времени? Какой разработчик не ставит метку времени для каждой коллекции данных? Если да, то в чем смысл клиента sdk? Я явно что-то упускаю.

Я пробовал это с клиента Firebase SDK без ошибок или отметок времени;

myFirestoreReference.ref.set({
  userId: firebaseUserCredential.user.uid,
  created: this.$fireStore.FieldValue.serverTimestamp()
})

Приведенный выше код успешно создает «userId», но не «созданную» временную метку.

Ответы [ 2 ]

2 голосов
/ 23 марта 2019

Вы можете проверить действительность отметок времени в правилах безопасности.Это правило требует, чтобы клиент предоставил токен метки времени сервера в поле created документа, записываемого в коллекцию "foo":

match /foo/{id} {
    allow write: if request.resource.data.created == request.time;
}

request.time - это времячто запрос был получен Firestore, который также является значением, подразумеваемым токеном, сгенерированным serverTimestamp() на клиенте.

0 голосов
/ 27 марта 2019

Мой ответ - использовать следующий код на моем сервере внутри API с использованием Firebase Admin SDK. Вот пример того, что я искал, но до сих пор не нашел. Приведенный ниже код демонстрирует использование ...

Firebase Admin sdk => FireStore

Это надежно, потому что оно приходит с моего сервера через SDK Firebase Admin, а не через SDK клиента Firebase, кроме того, serverTimestamp () устанавливается сервером FireStore, а не моим веб-сервером (через 'new Date ()') или клиентская машина, которая делает оригинальный запрос. Я смог понять этот ответ, выведя из примеров ...

Firebase Client sdk => FireStore https://firebase.google.com/docs/firestore/manage-data/add-data

и

Firebase Admin sdk => Firebase Auth https://firebase.google.com/docs/auth/admin/manage-users

var admin = require('firebase-admin');

admin.initializeApp({
  credential: admin.credential.cert({
    projectId: MY_FIREBASE_PROJECT_ID, 
    clientEmail: MY_FIREBASE_CLIENT_EMAIL,
    privateKey: MY_FIREBASE_PRIVATE_KEY,
  }),
  databaseURL: MY_FIREBASE_DATABASE_URL
});


var serverTimestamp = admin.firestore.FieldValue.serverTimestamp()    

admin.firestore().collection('someFireStoreCollection').doc(someFireStoreCollectionId).update({
  someDateField: serverTimestamp
}).then(function() {
  console.log("Successfully updated FireStore");
}).catch(function(error) {
  console.log("Error updating FireStore:", error);
  throw(error)
});
...