Angular 来自角度路由保护的Web Api调用
有谁能帮我解释一下,为什么在调用返回结果后,Angular guard内部的异步调用不会激活路由?我尝试了几种方法,利用承诺和观察,但运气有限。我还特别发现了albakov的建议。注意下面的代码片段对我来说很重要。我在控制台中看到了控制台消息,其中包含了我在服务器端api调用中能够破解的所有正确值。结果被传递到canActivate guard返回的可观察路径中,但路径未按预期激活 具有调用api并将_isauthorizedsubject与结果绑定的属性的服务方法:Angular 来自角度路由保护的Web Api调用,angular,rxjs,Angular,Rxjs,有谁能帮我解释一下,为什么在调用返回结果后,Angular guard内部的异步调用不会激活路由?我尝试了几种方法,利用承诺和观察,但运气有限。我还特别发现了albakov的建议。注意下面的代码片段对我来说很重要。我在控制台中看到了控制台消息,其中包含了我在服务器端api调用中能够破解的所有正确值。结果被传递到canActivate guard返回的可观察路径中,但路径未按预期激活 具有调用api并将_isauthorizedsubject与结果绑定的属性的服务方法: private _isAu
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);
});
没有任何类型的控制台错误发生,页面只是在可观察的布尔值解析为true后从不路由
更新
如果我将从登录组件到受保护(受保护)路由的重定向更改为硬重定向(即:window.location.href),而不是router.navigate
调用,则上述代码可以工作。如果没有登录组件的硬重定向,路由器将在api调用解析后取消对受保护路由的导航(如果启用跟踪)。
只需将可观察(
可观察
)返回到guard中,它就会工作 您是对的,它应该以这种方式工作,但由于某些原因,OIDC的附加组件会重新定向回路由,该路由会将您重新发送到被阻止的页面(未经授权时),从而导致路由器取消导航。如上所述,如果您发出硬刷新,它可以正常工作,因为它在获得授权后不会通过登录url。您是正确的,我使用的OAuth/OIDC库似乎存在问题。
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();
}