Как сделать аутентификацию роутера?Получение Observable <User>Из AngularFireAuth с последующим преобразованием в логическое значение для охраны - PullRequest
0 голосов
/ 21 декабря 2018

Я использую охрану маршрутизатора с AngularFireAuth, чтобы проверить, может ли пользователь ввести маршрут.Проблема в том, что AngularFireAuth возвращает тип <User>, в то время как для защиты требуется тип <boolean>.

В моем возвышенном тексте появилось сообщение об ошибке: 'Тип Пользователь не может назначаться типу boolean'


Я слежу за этим уроком: https://angularfirebase.com/lessons/google-user-auth-with-firestore-custom-data/

Я понятия не имею, как преобразовать то, что было получено из типа AngularFireAuth, для защиты маршрутизатора.

Это auth.service

interface User {
  uid: string;
  email: string;
  photoURL?: string;
  displayName?: string;
  favoriteColor?: string;
}


@Injectable({ providedIn: 'root' })
export class AuthService {

  user: Observable<User>;

  constructor(
    private afAuth: AngularFireAuth,
    private afs: AngularFirestore,
    private router: Router
  ) {

      //// Get auth data, then get firestore user document || null
      this.user = this.afAuth.authState.pipe(
        switchMap(user => {
          if (user) {
            return this.afs.doc<User>(`users/${user.uid}`).valueChanges()
          } else {
            return of(null)
          }
        })
      )
    }

Это auth.guard

canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean> {

      return this.auth.user.pipe()
           take(1),
           map(user => !!user),
           tap(loggedIn => {
             if (!loggedIn) {
               console.log('access denied')
               this.router.navigate(['/login']);
             }
         })
    )

Ошибка 'Типу пользователя нельзя присвоить тип логический' взято из return this.auth.user.pipe()auth.guard

Любая помощь будет оценена.

Спасибо.

1 Ответ

0 голосов
/ 21 декабря 2018

Ах .. Я только что видел раздел комментариев в этом блоге.

В коде была опечатка:

return this.auth.user.pipe()
           take(1),

должно быть

return this.auth.user.pipe(
           take(1),

Теперь это работает.

...