Firebase Angular 7身份验证持久性

时间:2019-02-10 13:06:23

标签: javascript angular firebase firebase-authentication angularfire

我是Firebase的新手,我正在尝试从angular 7应用程序实现身份验证。

这是我的身份验证服务:

@Injectable({
  providedIn: 'root'
})
export class AuthService {
 private user: Observable<firebase.User>;
 private userDetails: firebase.User;

 constructor(private angularFireAuth: AngularFireAuth) {
   this.user = this.angularFireAuth.user;
   this.user.subscribe(
     (user) => {
       if (user) {
         this.userDetails = user;
       }
       else {
         this.userDetails = null;
       }
     }
   );
 }

 signInGoogleLogin() {
   return this.angularFireAuth.auth.setPersistence(firebase.auth.Auth.Persistence.LOCAL)
        .then(() =>
       this.angularFireAuth.auth.signInWithPopup(
         new firebase.auth.GoogleAuthProvider()
       )
     );
 }

 isLoggedIn(): boolean {
   return this.userDetails != null;
 }
}

这是我的AuthGuard实现:

@Injectable({
 providedIn: 'root'
})
export class AuthGuard implements CanActivate {

 constructor(private router: Router, private authService: AuthService) { }

 canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): 
      Observable<boolean> | Promise<boolean> | boolean {
   if (this.authService.isLoggedIn()) {
     return true;
   }
   this.router.navigate(['login'], { queryParams: { returnUrl: state.url}});
   return false;
 }
}

我的问题是:持久性似乎不起作用。每当刷新页面时,我都必须登录,每当导航到另一个需要身份验证的组件时,我都需要再次登录。

当然,如果我使用“ signInWithRedirect”而不是“ signInWithPopup”,则会陷入日志记录循环,在该循环中,我重定向到我的登录页面,该页面发现我尚未登录,然后尝试登录我,将我重定向到我的登录页面发现我尚未登录,依此类推。

我认为所有这些问题实际上都与同一个问题有关:我的auth状态持久性实现有些错误。

所以我的问题很简单:我在做什么错了?:)

我希望能够登录,然后在刷新时保持登录状态。

感谢您的帮助。 :)

1 个答案:

答案 0 :(得分:2)

如果有人来这里寻找答案,这就是我的方法

auth.service.ts

import { auth, firestore } from 'firebase/app';

 constructor(
    private _fAuth: AngularFireAuth,
  ) {}

public async login(authInfo: UserAuthInfo) {
    if(authInfo.rememberMe) {
       await this._fAuth.setPersistence(auth.Auth.Persistence.LOCAL)
       console.log("local persistance", true);
    }
    const credential = await this._fAuth.signInWithEmailAndPassword(authInfo.username, authInfo.pass);
    ...
}

auth.guard.ts

export class AuthGuard implements CanActivate {

  constructor(
    private _fAuth: AngularFireAuth,
    private _router: Router
  ) {}

  canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean | UrlTree> {
      return this._authService.fAuth.authState.pipe(
        first(),
        map(user => !!user),
        tap(authenticated => {
          console.log("auth guard loggedin", authenticated);
          authenticated || this._router.parseUrl('/auth/login')
        })
      )
   }
  
}