我无权访问来自 Firestore 安全规则的自定义声明

mon*_*njo 5 firebase firebase-security google-cloud-firestore

我使用 firebase admin sdk 设置了自定义声明。我已经成功地使用它来控制前端甚至 RTDB 的访问,但我无法将它与 Firestore 数据库一起使用。这是我的安全规则:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth.token.admin == true;  
    } 
  }
}
Run Code Online (Sandbox Code Playgroud)

这是我的应用程序中的代码:

   const users = []
   firebase.firestore().collection('users')
    .get()
    .then(function (querySnapshot) {
      querySnapshot.forEach(function (doc) {
        users.push(doc.data())
      })
    })
    .then(() => {
      commit('setUsersList', users)
      commit('setLoading', false)
    })
    .catch(function (error) {
      console.log('Error getting documents:', error)
      commit('setLoading', false)
    })
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

Error: Missing or insufficient permissions
Run Code Online (Sandbox Code Playgroud)

mon*_*njo 4

我已经修复了错误。我的错误是我使用 admin sdk 设置权限,但我没有传递布尔值而是字符串。

例如,我将用户设置为 uid '1',如下所示: axios.post('/admin/setadminprivileges/1/true')

在我的 firebase 函数中我得到:

app.post('/admin/setadminprivileges/:id/:permission', (req, res) => {
  const permission = req.params.permission // this is a string "true"
  const uid = req.params.id // "1"
  const payload = {admin: permission}
  admin.auth().setCustomUserClaims(uid, payload)
})
Run Code Online (Sandbox Code Playgroud)

现在这个工作正常:

app.post('/admin/setadminprivileges/:id/:permission', (req, res) => {
  const permissionString = req.params.permission
  const permission = permissionString === 'true' // this is now a boolean
  const uid = req.params.id
  const payload = {admin: permission}
  admin.auth().setCustomUserClaims(uid, payload)
})
Run Code Online (Sandbox Code Playgroud)

不管怎么说,还是要谢谢你。我知道这一定是我自己的一个愚蠢问题,因为 Firebase 是一款可靠的产品。