【问题标题】:How do you determine if a user is already authenticated in Angular Firebase?您如何确定用户是否已经在 Angular Firebase 中进行了身份验证?
【发布时间】:2020-03-25 22:45:16
【问题描述】:

如果用户未使用 AngularFireAuth 进行身份验证,我正在编写一个保护程序以将用户重定向到登录页面。如果没有这个库,我会将令牌存储在本地/会话存储中,当警卫触发时,我会检查存储以查看是否存在令牌。 AngularFireAuth 在数据库中存储一个令牌(其中包含身份验证信息):

但是直接检查它是不明智的,因为 AngularFireAuth 可能会在未来的任何日期改变它的工作方式。它不完全是记录在案的公共 API 的一部分。

在旧版本的 AngularFireAuth 中,我可以在我的服务中包含此方法来执行此检查:

import { AngularFireAuth } from '@angular/fire/auth';

export class AuthService {
  constructor(private readonly service: AngularFireAuth) {}

  public login(credentials: Credentials) {
    const { email, password } = credentials;
    return this.service.auth.signInWithEmailAndPassword(email, password);
  }

  public isLoggedIn(): boolean {
    return !!this.service.auth.currentUser;
  }
}

但是,这不会在刷新时持续存在。因此,当我在系统中导航时,它工作正常,但如果我刷新或离开并返回,系统会提示我再次登录。

如何编写我的 isLoggedIn 方法以便在我的守卫中调用?

【问题讨论】:

    标签: angular firebase firebase-authentication angularfire2


    【解决方案1】:
    import { AngularFireAuthGuard, redirectUnauthorizedTo, redirectLoggedInTo } from '@angular/fire/auth-guard';
    
    const redirectUnauthorizedToHome = () => redirectUnauthorizedTo(['home']);
    const redirectLoggedInToAccount = () => redirectLoggedInTo(['my-account']);
    
    const routes: Routes = [
      { path: 'my-account', component: MyAccountComponent, canActivate: [AngularFireAuthGuard], data: { authGuardPipe: redirectUnauthorizedToHome } },
      { path: 'create-account', component: CreateAccountComponent, canActivate: [AngularFireAuthGuard], data: { authGuardPipe: redirectLoggedInToAccount } },
    ];
    

    为我工作,tks

    【讨论】:

    【解决方案2】:

    所以我需要能够确定用户是否在我的保护之外登录,所以这是我的解决方案:

    import { Injectable } from '@angular/core';
    import { AngularFireAuth } from '@angular/fire/auth';
    
    @Injectable()
    export class AuthService {
      constructor(
        private readonly service: AngularFireAuth
      ) {}
    
      public login(credentials: Credentials): Promise<any> {
        const { email, password } = credentials;
        return this.service.auth.signInWithEmailAndPassword(email, password);
      }
    
      public isLoggedIn(): Promise<boolean> {
        return new Promise((resolve: any) => {
          this.service.auth.onAuthStateChanged(( user: any ) => {
            user ? resolve(true) : resolve(false);
          });
        });
      }
    }
    
    

    【讨论】:

      【解决方案3】:

      我推荐使用 AngulaFireAuthGuard。无需添加任何特殊方法,它会为您处理一切。

      因此,您可以直接在 app-routing.module 中添加它,而不是使用常规保护。

      这是一个例子:

      进入app.module:

      import { AngularFireAuthGuardModule } from '@angular/fire/auth-guard'; 
      
      @NgModule({
         declarations: [],
         imports: [
            AngularFireAuthGuardModule,
         ],
         providers: [],
         bootstrap: []
      })
      

      进入 app-routing.module:

      import { AngularFireAuthGuard, redirectUnauthorizedTo, redirectLoggedInTo } from '@angular/fire/auth-guard';
      
      const redirectUnauthorizedToHome = () => redirectUnauthorizedTo(['home']);
      const redirectLoggedInToAccount = () => redirectLoggedInTo(['my-account']);
      
      const routes: Routes = [
        { path: 'my-account', component: MyAccountComponent, canActivate: [AngularFireAuthGuard], data: { authGuardPipe: redirectUnauthorizedToHome } },
        { path: 'create-account', component: CreateAccountComponent, canActivate: [AngularFireAuthGuard], data: { authGuardPipe: redirectLoggedInToAccount } },
      ];
      

      您可以从这里查看详细信息: https://github.com/angular/angularfire/blob/master/docs/auth/router-guards.md

      【讨论】:

      • 刚刚也发现了这一点,我阅读了 Firebase Auth 手册,但显然我在 AngularFire 手册中错过了这一点。
      • 不幸的是,它并不为人所知。也许它是新的我不知道。在与我的顶点项目苦苦挣扎了几天后,我突然发现了这个,瞧!唯一的缺点是只有关于那个的文档是我提到的页面。所以,如果你想做别的事情,那就不清楚了。我仍在为我自己的问题寻找答案:/
      • 有些时候,你必须跳过手册,直接进入源代码……代码。
      • 我刚刚工作过的一个问题 - AngularFireAuthGuard 有它自己的模块。 import { AngularFireAuthGuardModule } from '@angular/fire/auth-guard'; 这是出乎意料的。
      • 哦是的忘了提,让我编辑我的答案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-16
      • 1970-01-01
      相关资源
      最近更新 更多