从不具有auth

时间:2018-08-25 17:43:26

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

我正在使用以下Firestore安全规则:

// Allow read/write access on all documents to any user signed in to the application
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth.uid != null;
    }
  }
}

问题是,对于我的本机应用程序中的功能,将执行回调(以共享事务ID),并且该应用程序退出浏览器以处理该回调。在服务器上的回调脚本中,我有一些类似以下的代码:

        fetch(url, {
            method: 'GET',
            headers: {
                Accept: 'application/json',
            }
        }).then(response => {

          if (response.ok) {
            response.json().then(json => {

                if(json.data == "Manual sale") {
                    alert("Manual sale complete! Return to Fairstarter!");
                    return;
                }

                var quant = 0;
                var itemsRef = db.collection('items');
                var query = itemsRef.where('barcode', '==', String(json.data)).get()
                    .then(snapshot => {

                      snapshot.forEach(doc => {

                          ....

                          //UPDATE THAT IS LOCKED OUT BY PERMISSIONS
                          itemsRef.doc(doc.id).update({
                             [Object.keys(doc.data())[0]]]: {
                                quantity: newVal
                             }
                          })

问题是,在上面的代码块中,我尝试更新数据库,但是由于我不是来自具有用于身份验证的现有Firebase用户的事物,因此由于权限的原因,我被Firebase拒绝了。

如何在保持数据库安全的同时仍允许回调脚本更新数据库?

1 个答案:

答案 0 :(得分:0)

使用firebase匿名登录功能,在配置firebase之后,将其放在脚本的顶部:

    firebase.auth().onAuthStateChanged(function(user) {
      if (user) {
        // User is signed in.
        var isAnonymous = user.isAnonymous;
        //alert(user.uid);
        // ...
      } else {
        // User is signed out.
        // ...
      }
      // ...
    });

    firebase.auth().signInAnonymously().catch(function(error) {
          // Handle Errors here.
          var errorCode = error.code;
          var errorMessage = error.message;
          // ...
          alert(errorMessage);
    });

请不要忘记在Firebase项目设置中启用匿名身份验证。