AngularFire2를 사용하는 각도 2 RC6. 내 인증은 보호 된 경로 ("/ feed")로 리디렉션됩니다. AuthGuard에서 canActivate 메소드가 실행되면 인증은 항상 null입니다. 가드가 구성되기 전에 인증이 발생하는 것처럼 보이므로 가드에 가입하면 아무 것도 작동하지 않습니다.CanActivate가 작동하지 않는 AngularFire2 인증
login.ts
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]
}
];
인증-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;
});
}
그러나 :
로그인과 가드에서'console.log' 호출의 순서를 자세히 살펴볼 것입니다. 전자가 처음이라면 경비원은 라우팅 후에 발급 된 인증 상태를 수신하게되며 이는 사용자가보고있는 동작을 설명합니다. – cartant
죄송합니다. 콘솔 출력을 넣는 것을 잊어 버렸습니다. 질문에 추가했습니다. –