AngularFire 登录时缺少权限或权限不足,刷新后有效

AngularFire Missing or insufficient permissions on login, works after refresh

我有一个非常标准的 Angular 12 应用程序,用户使用 Firestore 登录,然后可以对自己的文档执行 CRUD 操作。

一旦您登录应用程序,它就会抛出

core.mjs:6495 ERROR FirebaseError: Missing or insufficient permissions.
    at index.esm2017.js:4327
    at ns (index.esm2017.js:4325)
    at to.onMessage (index.esm2017.js:11273)
    at index.esm2017.js:11227
    at index.esm2017.js:11250
    at index.esm2017.js:15093
    at index.esm2017.js:15126
    at ZoneDelegate.invoke (zone.js:372)
    at Object.onInvoke (core.mjs:25853)
    at ZoneDelegate.invoke (zone.js:371)

没有加载任何文档。但是,如果我只是刷新页面,错误就会消失并且文档会按预期加载。

我的认证服务很标准

@Injectable({
  providedIn: "root"
})
export class AuthService {
  
  constructor(private angularFireAuth: AngularFireAuth, private router: Router) {

  }

  public login() {
    signInWithPopup(getAuth(), new GithubAuthProvider())
      .then(() => {
        this.router.navigate(["/"]);
      })
      .catch((error) => {
        console.log(error);
      });
  }
}

我正在尝试在 RepositoryService

中加载 Firestore 文档
@Injectable({
  providedIn: "root"
})
export class RepositoryService {

  repositories$: BehaviorSubject<Repository[]> = new BehaviorSubject<Repository[]>([]);

  constructor(private angularFireAuth: AngularFireAuth, private firestore: AngularFirestore) {
    this.angularFireAuth.authState.subscribe(authUser => {
      if (authUser) {
        this.firestore
          .collection("user")
          .doc(authUser.uid)
          .collection<Repository>("repositories")
          .valueChanges()
          .subscribe(this.repositories$);
      }
    });
  }
}

这里使用的是 AngularFireAuth 的不同瞬间还是什么?

有趣的是,如果我注销,然后刷新页面并重新登录,一切都会按预期进行。但是,退出并再次直接重新登录会导致抛出 Missing or insufficient permissions 异常。

我可以通过将标准订阅替换为 switchMap

来解决错误
constructor(
  private angularFireAuth: AngularFireAuth,
  private firestore: AngularFirestore,
) {
  this.angularFireAuth.authState
    .pipe(
      switchMap((authUser) =>
        authUser
          ? this.firestore.collection('user').doc(authUser.uid).collection<Repository>('repositories').valueChanges()
          : of([])
      )
    )
    .subscribe(this.repositories$);
}

我认为问题的根源是 firebase 侦听器试图获取文档 during/after 导致它出错的注销过程。

这可以解释为什么在登录会话之间刷新页面可以解决问题。

尴尬。