私はFirebase Authを使用してAngle 2ルートのAuthGuardを構築しようとしています。 Angular 2 AuthGuard + Firebase Auth
この
はAuthGuardサービスです:import { Injectable } from '@angular/core';
import { CanActivate, Router,
ActivatedRouteSnapshot,
RouterStateSnapshot } from '@angular/router';
import { AuthService } from './auth.service';
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private AuthService: AuthService,
private router: Router) {}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
if (this.AuthService.loggedIn) { return true; }
this.router.navigate(['login']);
return false;
}
}
そして、これは、ユーザのがログインし、そのコンストラクタでプロパティ「LOGGEDIN」に結果をバインドするかどうかを確認するのAuthServiceです。
import { Injectable } from '@angular/core';
import { AngularFire } from 'angularfire2';
import { Router } from '@angular/router';
@Injectable()
export class AuthService {
loggedIn: boolean = false;
constructor(
public af: AngularFire,
public router: Router) {
af.auth.subscribe(user => {
if(user){
this.loggedIn = true;
}
});
}
}
ここでの問題は明らかに非同期です。 AuthGuardのcanActivate()は、 'loggedIn'をtrueに変更するためにサブスクリプションがデータを受信しないため、常にfalse値を返します。
これを修正するにはどうすればよいですか?
EDIT:
は、観察を返すようにAuthGuardを変更しました。
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
return this.af.auth.map((auth) => {
if (!auth) {
this.router.navigateByUrl('login');
return false;
}
return true;
});
}
あなたはログインにリダイレクトされないため、動作します...しかし、ターゲットのAuthGuarded Componentはレンダリングされません。
私のapp.routesと関係があるかどうかわかりません。
const routes: Routes = [
{ path: '', component: MainComponent, canActivate: [AuthGuard] },
...
];
export const routing = RouterModule.forRoot(routes);
こんにちは!あなたは落書きを作れますか? –
@GuillaumeLeMière炎ベースの認証が含まれているので、それはかなり難しいでしょう... – cerealex