【问题标题】:AngularFire2 authentication with CanActivate not working使用 CanActivate 的 AngularFire2 身份验证不起作用
【发布时间】:2017-01-18 03:27:39
【问题描述】:

Angular 2 RC6 使用 AngularFire2。我的身份验证有效,导致重定向到受保护的路由(“/feed”)。当 AuthGuard 中的 canActivate 方法触发时,身份验证始终为空。似乎身份验证发生在警卫被构建之前,所以警卫中的订阅什么都不做。

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

constructor(public af: AngularFire, private router: Router) {
  this.af.auth.subscribe(auth => console.log(auth));
}
login() {
  this.af.auth.login({
    provider: AuthProviders.Facebook,
    method: AuthMethods.Popup,
  }).then((x: FirebaseAuthState) => {
    console.log(x);
    this.router.navigate(['/feed']);
  }).catch(x => console.log(x));
}

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 中的操作永远不会发生。

【问题讨论】:

  • 我会仔细查看登录和警卫中console.log 调用的顺序。如果前者是第一个,则守卫将在路由之后收到发出的身份验证状态,这将解释您所看到的行为。
  • 对不起,我忘了把我的控制台输出,我把它添加到问题中

标签: angular angular2-routing angularfire2


【解决方案1】:

你可能想要这样的东西:

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 也没有为我触发。

【讨论】:

  • 如果auth observable 没有发出任何东西,我建议raising an issue,因为AngularFireAuth observable 是ReplaySubject with a buffer size of 1,所以它应该发出一个值。
  • 谢谢你的例子,如果 !auth 我不想返回 false 吗?
  • 嗯,这可能是真的,但我不记得是否将其设置为 false 会阻止导航...而且我现在无法触发 observable。
  • 所以问题是 angularfire2 不适用于 RC6 @RyanLangton,请参阅:github.com/angular/angularfire2/issues/493
猜你喜欢
  • 2016-10-22
  • 2012-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
  • 2012-03-18
相关资源
最近更新 更多