任何人都可以幫助我解決爲什麼Angular guard中的異步調用在調用返回結果後不會激活路由嗎?我嘗試了一些利用承諾和有限運氣觀察的方法。我也發現這個github issue特別是阿爾巴科夫的建議。對我來說,重要的是要注意執行下面的代碼片段。我在控制檯中看到控制檯消息,所有正確的值我也能夠在服務器端api調用中斷開。結果被傳遞到canActivate守護返回的可觀察值中,但路由未按預期激活。來自角度路由衛士的Web Api呼叫
服務方法與屬性,調用API,並結合與結果_isAuthorized主題:
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);
});
消費後衛可以激活方法:出現在頁面任何形式的
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();
}
沒有控制檯錯誤只是在可見布爾值的解析爲真之後纔會路由。
UPDATE 如果我改變重定向從登錄組件的保護(防護)路線硬重定向上面的代碼工作(即:window.location.href),而不是router.navigate
電話。如果沒有登錄組件的硬重定向,則路由器將在取消跟蹤後取消導航,並解析api調用後的受保護路由。
你是對的,它應該以這種方式工作,但由於某種原因,OIDC的附加組件重新轉回到將您重新發送到您被阻止的頁面(同時未經授權)的路徑導致導航被取消由路由器。如上所述,如果您發出硬刷新,則它可以正常工作,因爲它在授權後不會經過着陸URL。 – Shawn
你是對的,我使用的OAuth/OIDC庫似乎存在問題。 – Shawn