【问题标题】:ionic2 - angularfire2 - firestore: Missing or insufficient permissions on logoutionic2 - angularfire2 - firestore:注销时缺少权限或权限不足
【发布时间】:2017-10-19 13:47:52
【问题描述】:

我在使用 firebase 的“firestore”服务的 ionic2 项目上工作时遇到了这个问题。

我有一个 osservable 可以使用异步管道从模板中的 firestore 获取一些数据。 此端点上的规则仅向登录用户授予读写访问权限。 当我退出时,我会重定向到登录页面。

..现在问题来了..

当我登陆登录页面时,几秒钟后,跳出IonicErrorHandler,通知我权限不足。

所以; 我如何告诉 Firestore osservable; “嘿,伙计,别说了,如果有人再次登录,我稍后会打电话给你”

(我会在signOut之前尝试取消订阅()但不起作用,而且
它不是来自持久性)

重述:

当我退出时

    this.afAuth.auth.signOut();

错误:

 core.es5.js:1020 ERROR Error: Missing or insufficient permissions.
at new FirestoreError (error.js:164)
at JsonProtoSerializer.fromRpcStatus (serializer.js:126)
at JsonProtoSerializer.fromWatchChange (serializer.js:517)
at PersistentListenStream.onMessage (persistent_stream.js:334)
at persistent_stream.js:270
at persistent_stream.js:247
at async_queue.js:81
at t.invoke (polyfills.js:3)
at Object.onInvoke (core.es5.js:3890)
at t.invoke (polyfills.js:3)

(准确地说,我收到了 3 次。确切地说是集合中的文档数量)

我调用 firestore 端点的服务:

export interface Attivita { 
  id: string;  
  committente: string; 
  durata: number; 
  nome: string; 
  progetto: string;
  userId: string;
}

@Injectable()
export class FirebaseService {

  attivitaCollectionRef: AngularFirestoreCollection<Attivita>;
  attivita$: Observable<Attivita[]>;

  constructor(private afs: AngularFirestore, 
              public afAuth: AngularFireAuth ) {

}

  setOsservableAttivita(uId){
    this.attivitaCollectionRef = this.afs.collection('attivita',  ref => {
        return ref.where("userId", "==", uId)
      });
      this.attivita$ = this.attivitaCollectionRef.snapshotChanges().map(actions => {
        return actions.map(action => {
          console.log(action)
          const data = action.payload.doc.data() as Attivita;
          const id = action.payload.doc.id;
          return { id, ...data };
        });
      });
  }

}

tks 提前帮助我理解它 :)

【问题讨论】:

  • 您解决了这个问题吗?我也遇到了同样的问题
  • 我已经在这个问题上停留了一周。希望有人能帮帮我!
  • 您是否调用了登录页面中的任何集合?
  • unsubscribe() 不会是这里的问题。当您使用异步管道从模板中的 firestore 调用数据时,它会自动处理取消订阅。

标签: firebase ionic2 google-cloud-firestore


【解决方案1】:

我建议您观看 Firebase 中的 authState,并且仅在您通过身份验证时从 snapshotChanges 中获取。 switchMap 运算符允许您根据用户是否经过身份验证等条件在可观察对象之间切换。这是一个可能的解决方案的示例。

// Assuming rxjs 5.5.0 with lettable operators

import { map } from 'rxjs/operators/map';
import { switchMap } from 'rxjs/operators/switchMap';
import { empty } from 'rxjs/observable/empty';
import { create } from 'rxjs/observable/create';

const actions$ = this.attivitaCollectionRef.snapshotChanges()
    .map(actions => {
        return actions.map(action => {
            console.log(action)
            const data = action.payload.doc.data() as Attivita;
            const id = action.payload.doc.id;
            return { id, ...data };
        });
    });
}),


this.attivita$ = create(
    // Listen for changes in the authState
    subscriber => this.afAuth.onAuthStateChanged(subscriber))
)
.pipe(

    // Determine if the user is logged in
    map(user => !!user),

    // switchMap will unsubscribe from the previous observable
    // so when isLoggedIn switches to false actions$ will be unsubscribed from
    switchMap(isLoggedIn => isLoggedIn ? actions$ : empty()),
);

【讨论】:

    【解决方案2】:

    注销后调用它为我解决了这个问题:

    afStore.firestore.disableNetwork();
    

    【讨论】:

      【解决方案3】:

      是的,

      通常,这可以通过在您要离开的组件的 ngOnDestroy() 中取消订阅来解决。 我就是这样做的。

      所以对你来说,那就是:

      ngOnDestroy() {
            this.attivita$.unsubscribe();
      }
      

      但是,很难确定您应该取消订阅哪个,因为该错误没有给出任何指示。

      我已就您的问题向 angularFire 的开发人员添加了一个问题:

      https://github.com/angular/angularfire2/issues/1459.

      如果能帮助异常将您指向正确的方向,例如,未取消订阅的路径或最后一个路径段,那就太好了。

      此外,本文中还列出了执行此操作的其他方法: http://brianflove.com/2016/12/11/anguar-2-unsubscribe-observables/

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 2018-04-25
        • 1970-01-01
        • 2019-02-26
        • 2022-01-25
        • 2018-08-30
        • 2020-09-01
        • 2021-12-31
        • 2021-08-24
        • 1970-01-01
        相关资源
        最近更新 更多