使用MEAN堆栈验证承载令牌API

问题描述 投票:0回答:1

我正在开发一个有角度的应用程序,但我很难实现api的承载令牌验证。

该过程如下所示:

  1. Authguard要求AuthService验证本地存储的身份验证令牌
      canActivate(): boolean {
        if(this.AuthService.isAuthenticated()){
          return true;
        } else{
          this.router.navigate(['elsewhere/maybeToSwimmingPool']);
        }
      }
  1. AuthService调用isAuthenticated方法,如果令牌从api中有效,该方法将获取该令牌
      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);
      }
  1. Api解码令牌,检查用户是否存在于数据库中并返回布尔值
    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

angular api observable mean-stack bearer-token
1个回答
1
投票

您正在CanActivate防护中使用异步代码,因此您不应返回boolean,而应返回Observable<boolean>。同样,您的isAuthenticated方法不应调用subscribe,而应返回一个可观察的对象。您的代码不起作用的原因是Guard不会等待所有订阅块完成。相反,Guard会立即(同步)返回一些值,并且稍后会进行令牌检查。

我想如果您像这样构造它,它将起作用。不过我没有碰你的后端。

  1. 在守护程序中,您将返回可观察到的结果,如果用户未通过身份验证,请在tap运算符中进行副作用。守卫将订阅tap函数的返回值。
canActivate

这里没有订阅,您只是返回一个可观察的。

canActivate(): Observable<boolean> {
  return this.AuthService.isAuthenticated().pipe(
    tap( isAuthenticated => !isAuthenticated ?  this.router.navigate(['elsewhere/maybeToSwimmingPool']): 0)
  );

© www.soinside.com 2019 - 2024. All rights reserved.