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 导致它出错的注销过程。
这可以解释为什么在登录会话之间刷新页面可以解决问题。
尴尬。
我有一个非常标准的 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 导致它出错的注销过程。
这可以解释为什么在登录会话之间刷新页面可以解决问题。
尴尬。