CanActivate不工作的AngularFire2身份验证

CanActivate不工作的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

使用AngularFire2的角度2 RC6。我的身份验证工作,导致重定向到受保护的路由(“/feed”)。当AuthGuard中的canActivate方法激发时,身份验证始终为null。似乎在构建保护之前就发生了身份验证,因此保护中的订阅什么都不做

login.ts(此身份验证有效并重定向到“提要”)

feed.routes.ts

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;
    });
  }