Я пытаюсь реализовать защиту аутентификации в своем приложении Angular + Firebase.
Я использую комбинацию Firebase Authentication (FA) и Firebase Cloud Firestore (FCF) для сохранения пользователей.Поэтому просто пользователя FA недостаточно, мне нужно найти того же пользователя в FCF, чтобы считать пользователя вошедшим в систему.
Во время регистрации я сохраняю пользователей в FCF под id
, какuid
этого пользователя в FA.
В моем authentication.service
:
export class AuthenticationService {
public authenticatedUserSubject: Subject<null | User> = new Subject <null | User>();
public constructor(
private readonly angularFireAuth: AngularFireAuth,
private readonly angularFirestore: AngularFirestore
) {
this.angularFireAuth.authState.subscribe(
(userInfo: null | UserInfo) => {
if (userInfo === null) {
this.authenticatedUserSubject.next(null);
} else {
this.angularFirestore.collection<User>('users').doc<User>(userInfo.uid).valueChanges().pipe(take(1)).subscribe(
(user: undefined | User): void => {
if (typeof user === 'undefined') {
this.authenticatedUserSubject.next(null);
} else {
this.authenticatedUserSubject.next(user);
}
}
);
}
}
);
}
}
Насколько я понимаю, когда служба инициализируется, этот фрагмент кода начнет слушатьизменения в пользователе FA, после чего я проверю пользователя FCF и обновлю authenticatedUserSubject
.
В моем authenticated.guard
:
public canActivate(activatedRouteSnapshot: ActivatedRouteSnapshot, routerStateSnapshot: RouterStateSnapshot): Observable<boolean> {
return this.authenticationService.authenticatedUserSubject.pipe(take(1)).pipe(
map(
(user: null | User): boolean => {
if (user === null) {
this.router.navigateByUrl('/sign-in');
return false;
} else {
return true;
}
}
)
);
}
Проблемы:
- Страж не получает никакого значения от субъекта
- Если я использую BehaviourSubject вместо Subject с начальным значением
null
, при обновлении страницы будет выбрано значение null
в качестве значения по умолчанию, в результате чего пользователь получит/sign-in
Цели:
- При обновлении / загрузке приложения authenticatedUserSubject должен быть рассчитан до запуска средства защиты маршрута
- При выходе из системыохранник должен знать об изменении состояния
Также, если есть лучший способ реализовать это, пожалуйста, дайте мне знать!