如何使用Firestore安全规则解密加密的UID?

时间:2020-02-18 15:56:48

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

  1. 用户首次登录Firebase时,我得到了uid 使用phone number
  2. 然后我已经加密了uid
  3. 然后我在Firestore中创建了一个带有 Document ID users Collection uid,例如:users/uid

  4. 现在,如果用户想写入users/userIdconditiontrue,如下所示:

  match /users/{userId} {
     allow write: if request.auth.uid == userId;
  }

正如我在number 2中提到的,userId是加密的,但是request.auth.uid未加密。

那么我们如何在(userId)解密呢?

如果我使用sha256哈希,那么如何在客户端解码sha256?

我正在使用crypto-js

1 个答案:

答案 0 :(得分:3)

根据文档,您可以use hashed values in security rules。如果您未使用所描述的哈希算法之一,则它将无法正常工作。您可以在release notes中了解其工作原理:

新的散列和相邻散列方法是:

hashing.crc32()
hashing.crc32c()
hashing.sha256()
hashing.md5()
<ByteValue>.toBase64()
<ByteValue>.toHexString()
<String>.toUtf8()

例如,以前,如果Firestore中的电子邮件版本为 使用SHA-256散列,则无法将该电子邮件与 与auth对象一起发送的纯文本电子邮件。现在您可以:

hashing.sha256(request.auth.email.utf8()) == resource.data.ownerEmailHash

或者,如果您在文档中有一个字段供用户存储 他们的中篇小说,您可能希望使用一个较短的标识符 很长的字符串:

match /novellas/{hash} {
 allow write: if hash == hashing.sha256(request.resource.data.
           novella.utf8()) && resource == null
}

字符串被视为UTF-8编码的字节,返回值为 字节类型:

hashing.md5("Tag".utf8()) => b"wQEFjn6iG7vypayJMIjpCw=="