Firestore规则验证时间戳记

时间:2018-07-21 14:00:52

标签: firebase google-cloud-firestore firebase-security-rules

我想通过客户端发送Firestore文档的创建时间,并使用 Firestore规则验证时间,以避免调用Cloud Functions(定价)。

场景

我正在按照这样的Firestore规则测试来自客户端的请求:

allow create: if request.resource.data.TIMEFIELD == request.time;

该请求包含一个带有时间戳的TIMEFIELD,就像request.time一样。

问题

显然,请求时间和我在发送请求之前立即设置为字段的时间是不相等的,因此无法进行比较。

以下是request.time在文档中的定义。

  

When the request was received by the service.

我想知道是否有一种方法可以在文档中设置等于request.time的字段。

由于an issue with Flutter,我无法使用服务器端时间戳。
因此,我需要知道如何使用Firestore Rules验证time.now之类的客户端时间戳。

3 个答案:

答案 0 :(得分:1)

您可以使用Timestamp向时间字段(docs)添加约束。

以下是如何确保更改在一定秒数内的示例:

function withinSeconds(secs) {
  return request.resource.data.TIMEFIELD.seconds() - request.time.seconds() <= secs
    && request.resource.data.TIMEFIELD.seconds() - request.time.seconds() >= -secs
}

编辑

以上内容用于在request.time的阈值内设置值。

同时,您也可以只使用REST API。只需提出一个包含writeupdate的{​​{1}}请求即可。 transform是您设置服务器时间戳的地方。 Here是帮助理解如何构建请求的工具。

答案 1 :(得分:0)

您首先必须记住创建(或最后更新)时间戳:

firestore().collection("items").add({
    ....
    created: firebase.firestore.FieldValue.serverTimestamp()
});

为了让客户端知道时间戳,您稍后将尝试比较该时间戳。

答案 2 :(得分:0)

目前,拥有准确时间戳(带有服务器时间)的唯一方法是with the help of Cloud Functions
这是由于 Flutter当前不支持 template<typename OriginalMatrix2D, typename RotatedMatrix2D> void rotate_2d_matrix_clockwise_impl(OriginalMatrix2D const & original_matrix, RotatedMatrix2D & rotated_matrix, int const M, int const N) { for (auto x = 0; x < N; ++x) { for (auto y = 0; y < M; ++y) { // Source : https://stackoverflow.com/questions/4780119/2d-euclidean-vector-rotations rotated_matrix[y][-x -1 +N] = original_matrix[x][y]; } } } #include <iostream> #include <vector> #include <array> template<typename Matrix2D> void print_matrix(Matrix2D const & vec) { std::cout << "size of matrix is [" << vec[0].size() << " x " << vec.size() << "]\n"; for (auto const & inner_vec : vec) { for (auto const & item : inner_vec) { std::cout << item << ", "; } std::cout << std::endl; } } template<typename OriginalMatrix2D, typename RotatedMatrix2D> void rotate_2d_matrix_clockwise_impl(OriginalMatrix2D const & matrix, RotatedMatrix2D & rotated_matrix, int const M, int const N) { for (auto x = 0; x < N; ++x) { for (auto y = 0; y < M; ++y) { // Source : https://stackoverflow.com/questions/4780119/2d-euclidean-vector-rotations rotated_matrix[y][-x -1 +N] = matrix[x][y]; } } } template<typename T, size_t M, size_t N> auto rotate_2d_matrix_clockwise(std::array<std::array<T, M>, N> const & original_matrix) -> std::array<std::array<T, N>, M> { std::array<std::array<T, N>, M> rotated_matrix; rotate_2d_matrix_clockwise_impl(original_matrix, rotated_matrix, M, N); return rotated_matrix; } template<typename Matrix2D> auto rotate_2d_matrix_clockwise(Matrix2D const & original_matrix) -> Matrix2D { int const M = original_matrix[0].size(); int const N = original_matrix.size(); Matrix2D rotated_matrix; rotated_matrix.resize(M); for (auto x = 0; x < M; ++x) { rotated_matrix[x].resize(N); } rotate_2d_matrix_clockwise_impl(original_matrix, rotated_matrix, M, N); return rotated_matrix; } int main() { std::array<std::array<int, 4>, 3> data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; std::cout << "\nBefore Rotation :\n"; print_matrix(data); std::cout << "\nAfter 2nd Clockwise Rotation :\n"; print_matrix(rotate_2d_matrix_clockwise(rotate_2d_matrix_clockwise(data))); std::vector<std::vector<char>> data2 = { {'a', 'b', 'c', 'd'}, {'e', 'f', 'g', 'h'}, {'i', 'j', 'k', 'l'}}; std::cout << "Before Rotation :\n"; print_matrix(data2); std::cout << "\nAfter Clockwise Rotation :\n"; print_matrix(rotate_2d_matrix_clockwise(data2)); return 0; } 云函数

您可以track this ongoing issue关于FieldValue在Flutter Cloud Firestore插件中的实现。

相关问题