您如何确定用户是否已在 Angular Firebase 中通过身份验证?
How do you determine if a user is already authenticated in Angular Firebase?
我正在编写一个保护程序,以在用户未使用 AngularFireAuth 进行身份验证时将用户重定向到登录页面。如果没有这个库,我会在 local/session 存储中存储一个令牌,当守卫触发时,我会检查存储以查看令牌是否存在。 AngularFireAuth 在数据库中存储一个令牌(其中包含身份验证信息):
然而,直接检查它是不明智的,因为 AngularFireAuth 可能会在未来的任何时候改变它的工作方式。它不完全是文档 public 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
方法以便在我的守卫中调用?
我推荐使用 AngulaFireAuthGuard。无需添加任何特殊方法,它会为您处理一切。
因此,您可以在您的应用程序中直接添加它,而不是使用常规保护。
这是一个例子:
进入app.module:
import { AngularFireAuthGuardModule } from '@angular/fire/auth-guard';
@NgModule({
declarations: [],
imports: [
AngularFireAuthGuardModule,
],
providers: [],
bootstrap: []
})
并进入应用程序-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
所以我需要能够确定用户是否在我的守卫之外登录,所以这是我的解决方案:
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);
});
});
}
}
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 } },
];
对我有用,谢谢
我正在编写一个保护程序,以在用户未使用 AngularFireAuth 进行身份验证时将用户重定向到登录页面。如果没有这个库,我会在 local/session 存储中存储一个令牌,当守卫触发时,我会检查存储以查看令牌是否存在。 AngularFireAuth 在数据库中存储一个令牌(其中包含身份验证信息):
然而,直接检查它是不明智的,因为 AngularFireAuth 可能会在未来的任何时候改变它的工作方式。它不完全是文档 public 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
方法以便在我的守卫中调用?
我推荐使用 AngulaFireAuthGuard。无需添加任何特殊方法,它会为您处理一切。
因此,您可以在您的应用程序中直接添加它,而不是使用常规保护。
这是一个例子:
进入app.module:
import { AngularFireAuthGuardModule } from '@angular/fire/auth-guard';
@NgModule({
declarations: [],
imports: [
AngularFireAuthGuardModule,
],
providers: [],
bootstrap: []
})
并进入应用程序-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
所以我需要能够确定用户是否在我的守卫之外登录,所以这是我的解决方案:
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);
});
});
}
}
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 } },
];
对我有用,谢谢