2017-07-18 4 views
1

Kann mir jemand helfen, warum ein asynchroner Anruf in einem Angular Guard die Route nicht aktiviert, nachdem das Ergebnis vom Anruf zurückgegeben wurde? Ich habe ein paar Ansätze ausprobiert, die Versprechungen und Observable mit wenig Glück nutzen. Ich fand auch diese github issue speziell die Albakov-Empfehlung. Es ist wichtig für mich, die folgenden Snippets zu beachten. Ich sehe die Konsolenmeldung in der Konsole mit allen korrekten Werten, die ich auch auf meinem Server-seitigen API-Aufruf hätte brechen können. Das Ergebnis wird in die Observable canActivate Guard Returns übergeben, aber die Route wird nicht wie erwartet aktiviert.Web-API-Anruf von einem Angular Route Guard

Service-Methode mit Eigenschaften, die die API-Aufrufe und binden das _isAuthorized Subjekt mit dem Ergebnis:

private _isAuthorized: ReplaySubject<boolean> = new ReplaySubject(1); 
get isAuthorized() { return this._isAuthorized.asObservable(); } 

checkAuthority(id: number) { 
    return this._http.get(this._apiUrl).toPromise().then((response) => { 
     console.log(response + ' I resolved!'); 
     if (response.status === 200) 
      this._isAuthorized.next(true); 
    }); 

Konsumieren Wache Methode aktivieren:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): any { 
    let id: number = this.getId(); 

    if (!this._oauthService.hasValidIdToken()) { 
    this._router.navigate([`/login/${id}`]); 
    return Observable.of(false); 
    } 

    this._myService.checkAuthority(id); 
    return this._myService.isAuthorized.first(); 
} 

Keine Konsole Fehler irgendwelcher Art auftreten, die Seite Niemals nach der Auflösung des beobachtbaren booleschen Werts zu true.

UPDATE Der obige Code funktioniert, wenn ich die Umleitung auf den geschützten (bewacht) Weg von der Login-Komponente zu einer harten Umleitung (dh: window.location.href) ändern, anstatt ein router.navigate Anruf. Ohne diese harte Umleitung von der Login-Komponente bricht der Router die Navigation ab, wenn ich die Verfolgung nach der Auflösung des API-Anrufs auf die geschützte Route umschalte.

Antwort

2

Angular 2 - Routing - CanActivate work with Observable

zurückkehren einfach die beobachtbaren (Observable<boolean>) in der Wache und es wird funktionieren!

+0

Sie haben recht, es sollte so funktionieren, aber aus irgendeinem Grund mit der zusätzlichen Komponente eines OIDC zurück zu einer Route, die Sie erneut auf die Seite sendet, von der Sie blockiert wurden (während nicht autorisiert) verursacht Navigation abgebrochen werden durch den Router. Wie oben erwähnt, wenn Sie eine harte Aktualisierung durchführen, funktioniert es gut, da es nach der Autorisierung nicht durch die Landing-URL geht. – Shawn

+0

Sie haben Recht, es scheint ein Problem mit der von mir verwendeten OAuth/OIDC-Bibliothek zu bestehen. – Shawn