【问题标题】:Get error FirebaseError: Missing or insufficient permissions获取错误 FirebaseError:缺少权限或权限不足
【发布时间】:2020-08-19 06:29:31
【问题描述】:

我使用 Angular 8 开发网络应用程序,并使用 @angular/fire v5.4.2 和 firebase js SDK v7.8.0 连接到 firebase。每次我想在 firestore 中获取文档时,它总是显示错误

FirebaseError: Missing or insufficient permissions.
    at new FirestoreError (https://localhost:4200/vendor.js:130146:28)
    at JsonProtoSerializer.push.../../node_modules/@firebase/firestore/dist/index.cjs.js.JsonProtoSerializer.fromRpcStatus (https://localhost:4200/vendor.js:145520:16)
    at JsonProtoSerializer.push.../../node_modules/@firebase/firestore/dist/index.cjs.js.JsonProtoSerializer.fromWatchChange (https://localhost:4200/vendor.js:146033:44)
    at PersistentListenStream.push.../../node_modules/@firebase/firestore/dist/index.cjs.js.PersistentListenStream.onMessage (https://localhost:4200/vendor.js:142655:43)
    at https://localhost:4200/vendor.js:142584:30
    at https://localhost:4200/vendor.js:142624:28
    at https://localhost:4200/vendor.js:131493:20
    at ZoneDelegate.invoke (https://localhost:4200/polyfills.js:3690:26)
    at Object.onInvoke (https://localhost:4200/vendor.js:83071:33)
    at ZoneDelegate.invoke (https://localhost:4200/polyfills.js:3689:52)

这是我尝试获取文档时的代码

loginFirebase(): Promise<any> {
  return new Promise((resolve, reject) => {
    firebase.auth().signInAnonymously().then(res => {
      resolve(res);
    }).catch(err => {
      reject(err);
    });
  });
}

login(username: string, password: string): Promise<IUsers> {
  return new Promise((resolve, reject) => {
     this.loginFirebase().then(userLogin => {
        this.setUser(res).then(() => {
           resolve();
        }).catch(err => {
           reject(err);
        });
     }).catch(errorFirebase => {
        reject(errorFirebase);
     });
  }
}

setUser(data: UserLogin): Promise<any> {
    return new Promise((resolve, reject) => {
      const userData: IUsers = {
        userId: data.doctor.id.toString(),
        userFullName: `${data.doctor.firstName} ${data.doctor.lastName}`,
        userPhoto: data.doctor.profileImage || '',
        userStatus: UserStatus.ACTIVE,
        userType: data.roles[0].role,
        token: data.token,
        sex: data.doctor.sex,
        email: data.name
      };
      try {
        this.afStore.collection(`${environment.firestoreCollection}users`, ref => ref.where('userId', '==', userData.userId.toString()))
          .get()
          .subscribe(doc => {
            resolve(doc)
          }, err => {
             console.error(err);
          });
       } catch (error) {
          this.translate.get('error_message', {error: 'catch saveUser'}).subscribe(err => {
             if (confirm(err)) {
                this.setUser(data);
             } else {
                reject(error);
             }
          });
       }

这是firestore的规则

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if isAuth(request);
    }
    
    function isAuth(req) {
      return req.auth != null;
    }
  }
}

当网络应用程序匿名登录时,我检查它的 uid 是否已经在 firebase 身份验证中。我可能在这里做错了什么?有人可以帮帮我吗?

【问题讨论】:

  • 仅供参考,您不需要将所有现有的承诺包装在新的承诺中。 Firebase SDK 返回的 Promise 将自行解决或拒绝,无需所有额外代码。
  • 哦,非常感谢您的反馈。我稍后会改变它。 :D

标签: firebase google-cloud-firestore firebase-authentication firebase-security angularfire2


【解决方案1】:

您应该使用auth state observer 来确定用户何时真正登录并能够进行经过身份验证的查询。事实证明,signInAnonymously 返回的承诺实际上并不是用户完全登录的指标。

【讨论】:

  • 所以你的意思是在我拨打signInAnonymously之后我需要拨打firebase.auth().onAuthStateChanged来确保用户已经成功登录??
  • 您可以随时设置观察者。只要用户的登录状态发生变化,就会调用您提供的回调。
  • 我试过了,但不幸的是我仍然遇到同样的错误......
  • 在您根据上述建议进行更改后,能否编辑您描述中提供的代码?
猜你喜欢
  • 2021-10-31
  • 2022-01-15
  • 2021-12-01
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-06
  • 2021-03-10
相关资源
最近更新 更多