NavigateByUrl无法通过onTokenReceived使用angular-oauth2-oidc接收

时间:2020-04-03 15:02:11

标签: angular angular-oauth2-oidc

我正在使用angular-oauth2-oidc程序包,正在使用隐式流,并且(目前)无法迁移到代码流。

流程结束时,我想导航到原始URL,我已经使用preserving state作为文档建议。

我的问题是我无法从onTokenReceived函数导航,由navitageByUrl解决的诺言通过false解决,但在控制台上没有错误:

export class AppComponent {
    url: string;    

    constructor(
        private oauthService: OAuthService, 
        private router: Router) {

        this.url = window.location.pathname; // Get requested url.
    }

    ngOnInit() {        
        this.oauthService.loadDiscoveryDocument().then(res => {
            console.log(res);
            this.oauthService.tryLogin({
                onTokenReceived: (info) => {
                    // Receive state and navitage to.
                    this.router.navigateByUrl(info.state).then(res => {
                        if (!res) {
                            console.error("Navigate to " + info.state + " after get token:" + res);
                        }
                    });
                }
            }).then(res => {
                if (!res) { // If not login init implicit flow passing url as state.
                    this.oauthService.initImplicitFlow(this.url);                
                }

            })
        })        

    }
}

但是,如果使用setTimeout在100毫秒后运行,它将起作用:

onTokenReceived: (info) => {
    // Receive state and navitage to.
    setTimeout(() => {
        this.router.navigateByUrl(info.state).then(res => {
            if (!res) {
                console.error("Navigate to " + info.state + " after get token:" + res);
            }
        });
    }, 100); // With less than 100 not works.
}

有人可以帮助我吗? 为什么NavigationByUrl不起作用?

1 个答案:

答案 0 :(得分:2)

我一直在调试角度路由器,以了解导航为什么会以false解析。我已经看到,如果启动其他导航,则可以取消导航。好吧,我已经记录了路由器事件,并且可以看到在导航过程中其他导航开始了。

这是日志:

{ path:"", redirectTo: "welcome", pathMatch: "full"}{ path:"", redirectTo: "welcome", pathMatch: "full"}

我在角度路由配置中有这样的重定向:

this.router.navigateByUrl(state).then(res => {
  if (!res) {
    this.router.navigateByUrl(state);
  }
});

不是angular-oauth2-oidc问题...

当导航承诺以false解析后,/ welcome的导航已完成,因此我决定再次尝试,再次运行导航,这一次可行。

类似的东西:

seff

由于导航失败会引发异常,仅当将promise解析为false时,无一例外地是由于另一个导航会取消您的导航。

这解决了我的问题。