我正在使用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不起作用?
答案 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时,无一例外地是由于另一个导航会取消您的导航。
这解决了我的问题。