angular - 登录时,Angular 6 auth guard 停留在空白页面上
问题描述
我找到了这个答案,我正在修改它以使用我的身份验证:Angular 6 AuthGuard
但是,当用户成功通过身份验证时,身份验证守卫只是转到空白页面而不是转发到 URL。请注意,当用户没有令牌时,它会按预期工作。它转发到登录页面。
我看到“有效令牌”行的控制台输出,但没有发生重定向。另外,如果我输入“return true;” 在处理程序的顶部,转发工作。
这是来自我的身份验证服务的有问题的代码块:
authenticationHandler(): boolean {
if (this.myToken) {
this._auth.validateToken(this.myToken)
.subscribe((result) => {
if (result.value) {
// TODO
console.log('AuthGuard: valid token');
this.loggedIn.next(true);
return true;
} else {
this.loggedIn.next(false);
this._router.navigate(['/login']);
return false;
}
});
} else {
this.loggedIn.next(false);
this._router.navigate(['/login']);
return false;
}
}
canActivate(): boolean {
return this.authenticationHandler();
}
解决方案
您true
在 subscribe 函数内部返回,该值不会进一步传递给路由保护。相反,路由守卫正在返回undefined
,其评估结果为falsey
。
您希望路由守卫在返回之前等待令牌验证。实现这一点的最简单方法是使用 async/await 语法。
async authenticationHandler(): Promise<boolean> {
if (this.myToken) {
const result = await this._auth.validateToken(this.myToken).toPromise();
if (result.value) {
// TODO
console.log('AuthGuard: valid token');
this.loggedIn.next(true);
return true;
} else {
this.loggedIn.next(false);
this._router.navigate(['/login']);
return false;
}
} else {
this.loggedIn.next(false);
this._router.navigate(['/login']);
return false;
}
}
这样,您的代码将在退出路由保护之前获得验证结果。
推荐阅读
- c++ - 用数字初始化常量引用
- typescript - 用函数理解 TypeScript 对象
- node.js - 无法在 Cloud9 上的节点上创建异步方法
- image - 图像检测中的线和边缘有什么区别?
- apache-kafka - 清除kafka主题后如何返回原始日志保留
- icecast - 当我尝试使用liquidsoap通过icecast流式传输音频时,pls文件中的Http源不起作用
- javascript - 反应原生 onDestroy 事件
- azure - Azure OpenID 配置文件范围 - 不包括图片?
- gruntjs - Grunt 插件进程
- bash - 需要将 basename 输出发送到文件