CanActivate不工作的AngularFire2身份验证
使用AngularFire2的角度2 RC6。我的身份验证工作,导致重定向到受保护的路由(“/feed”)。当AuthGuard中的canActivate方法激发时,身份验证始终为null。似乎在构建保护之前就发生了身份验证,因此保护中的订阅什么都不做 login.ts(此身份验证有效并重定向到“提要”) feed.routes.tsCanActivate不工作的AngularFire2身份验证,angular,angular2-routing,angularfire2,Angular,Angular2 Routing,Angularfire2,使用AngularFire2的角度2 RC6。我的身份验证工作,导致重定向到受保护的路由(“/feed”)。当AuthGuard中的canActivate方法激发时,身份验证始终为null。似乎在构建保护之前就发生了身份验证,因此保护中的订阅什么都不做 login.ts(此身份验证有效并重定向到“提要”) feed.routes.ts export const feedRoutes: Routes = [ { path: '', component: FeedComponen
export const feedRoutes: Routes = [
{
path: '',
component: FeedComponent,
canActivate: [AuthGuard]
}
];
auth-guard.service.ts
import { Injectable } from '@angular/core';
import { CanActivate, Router,
ActivatedRouteSnapshot,
RouterStateSnapshot } from '@angular/router';
import { AngularFire, AngularFireAuth, FirebaseAuthState } from 'angularfire2';
import { Observable } from 'rxjs';
@Injectable()
export class AuthGuard implements CanActivate {
auth: FirebaseAuthState;
constructor(private af: AngularFire, private router: Router) {
console.log('auth guard constructed');
this.af.auth.subscribe(authState => console.log(authState));
this.af.auth.subscribe(x => this.auth = x);
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
console.log('can activate ' + this.auth)
if (this.auth == null){
// this part always fires
console.log('no auth!')
this.router.navigate(['/login']);
return false;
}
console.log('authenticated');
return true;
}
}
以下是打印到控制台的内容:
Object {auth: W, uid: "xYFs8kMDpKdYKxDw4AL21FtnSWn1", provider: 2, facebook: Of}
auth-guard.service.ts:13 auth guard constructed
auth-guard.service.ts:19 can activate undefined
auth-guard.service.ts:21 no auth!
请注意.subscribe中的操作从未发生。您可能需要这样的操作:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
console.log("canActivate");
return this.af.auth.take(1).map(auth => {
console.log("auth:" + auth);
if (!auth) {
this.router.navigateByUrl('/login');
return true;
}
return !!auth;
});
}
但是auth observable也不是为我触发的。我会仔细查看
控制台的顺序。log
您在登录和守卫中的调用。如果前者是第一个,警卫将在路由后收到发出的身份验证状态,这将解释您看到的行为。对不起,我忘了放控制台输出,我已经将它添加到问题中,如果auth
observable没有发出任何东西,我建议,因为angularfieauth
observable是一个,所以它应该发出一个值。谢谢你的例子,如果!验证?嗯,那可能是真的,我不记得如果弄错了会不会妨碍导航。。。我现在无法发射可观测到的。所以问题是angularfire2不适用于RC6@RyanLangton,请参见:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
console.log("canActivate");
return this.af.auth.take(1).map(auth => {
console.log("auth:" + auth);
if (!auth) {
this.router.navigateByUrl('/login');
return true;
}
return !!auth;
});
}