我正在开发一个有角度的应用程序,但我很难实现api的承载令牌验证。
该过程如下所示:
canActivate(): boolean {
if(this.AuthService.isAuthenticated()){
return true;
} else{
this.router.navigate(['elsewhere/maybeToSwimmingPool']);
}
}
isAuthenticated(){
if(localStorage.getItem('token')){
this.verifyToken().subscribe(
data => {return data;}
)
}else{
return false;
}
}
verifyToken() : Observable<boolean>{
const url = this.apiVerifyTokenUrl + '/' + localStorage.getItem('token');
return this.http.get<boolean>(apiVerifyTokenUrl, this.httpOptions);
}
exports.verifyToken = (req, res, next) => {
try{
verifiedJwt = jwt.verify(req.params.token, secret);
let userId= verifiedJwt.userId;
User.findOne({_id: userId})
.then(() => res.status(200).send('true'))
.catch(error => res.status(200).send('false'));
}
catch(e){
res.status(200).send('false');
}
}
我不确定我编写了什么怪兽。也许Authguard不能异步等待可观察的对象?我真的不知道我的代码有什么问题,希望你们能找到致命的错误并给我有关我的代码的建议?这些是我迈出第一步的第一步,欢迎大家提出批评,批评我:)
祝您有美好的一天,Eelke Johnson
您正在CanActivate防护中使用异步代码,因此您不应返回boolean
,而应返回Observable<boolean>
。同样,您的isAuthenticated方法不应调用subscribe
,而应返回一个可观察的对象。您的代码不起作用的原因是Guard不会等待所有订阅块完成。相反,Guard会立即(同步)返回一些值,并且稍后会进行令牌检查。
我想如果您像这样构造它,它将起作用。不过我没有碰你的后端。
tap
运算符中进行副作用。守卫将订阅tap
函数的返回值。canActivate
这里没有订阅,您只是返回一个可观察的。
canActivate(): Observable<boolean> {
return this.AuthService.isAuthenticated().pipe(
tap( isAuthenticated => !isAuthenticated ? this.router.navigate(['elsewhere/maybeToSwimmingPool']): 0)
);