如何在angular 2中api响应状态为401时实现用于刷新令牌的拦截器

如何在angular 2中api响应状态为401时实现用于刷新令牌的拦截器,angular,Angular,我是Angualr 2的新手,当api响应为非授权(401)错误时,我在刷新令牌时面临问题。我们希望通过使用拦截器来实现这个概念。请提供任何输入或建议。在angular 2中,我们没有拦截器的概念,通过创建扩展标准http服务的自定义http服务也可以实现这一点。在应用程序模块中,您可以指示angular在任何需要http服务的地方使用自定义http服务。在angular 2中,我们没有拦截器的概念,通过创建扩展标准http服务的自定义http服务也可以实现这一点。在应用程序模块中,您可以指示a

我是Angualr 2的新手,当api响应为非授权(401)错误时,我在刷新令牌时面临问题。我们希望通过使用拦截器来实现这个概念。请提供任何输入或建议。

在angular 2中,我们没有拦截器的概念,通过创建扩展标准http服务的自定义http服务也可以实现这一点。在应用程序模块中,您可以指示angular在任何需要http服务的地方使用自定义http服务。

在angular 2中,我们没有拦截器的概念,通过创建扩展标准http服务的自定义http服务也可以实现这一点。在应用程序模块中,您可以指示angular在需要http服务的任何地方使用自定义http服务。

下面的代码将有助于实现刷新令牌拦截器 `get(url:string):可观察{

    let headers = new Headers({'Content-Type': 'application/json', 'Authorization': 'bearer ' + this.token});
    return this._http.get(url, {headers: headers})
        .map((res: Response) => {
            return res;
        })
        .catch(error=> {
            if (error.status === 401) {
                return this.RefreshToken().flatMap((newToken) => {
                    let newheaders = new Headers({
                        'Content-Type': 'text/plain',
                        'Authorization': 'bearer ' + this.token
                    });
                    return this._http.request(url, {headers: newheaders});
                })
            } else {
                return Observable.throw(error);
            }
        });
} `

下面的代码将帮助实现刷新令牌拦截器 `get(url:string):可观察{

    let headers = new Headers({'Content-Type': 'application/json', 'Authorization': 'bearer ' + this.token});
    return this._http.get(url, {headers: headers})
        .map((res: Response) => {
            return res;
        })
        .catch(error=> {
            if (error.status === 401) {
                return this.RefreshToken().flatMap((newToken) => {
                    let newheaders = new Headers({
                        'Content-Type': 'text/plain',
                        'Authorization': 'bearer ' + this.token
                    });
                    return this._http.request(url, {headers: newheaders});
                })
            } else {
                return Observable.throw(error);
            }
        });
} `

您可以在subscribe中更好地处理401unhorized,下面是代码,您可以在组件本身中使用它

this.dynamic.getProfileDetails(this.userId, this.password).subscribe(
      v => (this.firstName = v.firstName),
      (err) => {
        // check if it is 401 and the token is invalid
        if (err.status == 401 && err.json().oauth2ErrorCode=='invalid_token') {
          console.log("Error Description " + err.json().oauth2ErrorCode);
          console.log("inside component error");
          //  refresh the token
          console.log("refresh the token")
          this._getNewToken.getNewTokenService().subscribe(
            v => {
              //  token is refreshed so retry the original request
              console.log("retry the original request with the new acces token")
              this.dynamic.getProfileDetails(this.userId, this.password).subscribe(
                v => (this.firstName = v.firstName)
              )
            },
            (refreshErr) => {
              if(refreshErr.status == 401 && refreshErr.json().oauth2ErrorCode=='invalid_token')
              {
                console.log("refresh token 401"+refreshErr.json().oauth2ErrorCode);
                this._router.navigate(['login']);
              }
              else if(refreshErr.status==400)
              {
                console.log("inside 400 "+refreshErr );
                this._router.navigate(['login']);
              }
              else
              {
                console.log("error des "+refreshErr );
                this._router.navigate(['login']);
              }
            }
          );



        }
        else{
               //serve  error logout from the app
                this._router.navigate(['login']);
               console.log("server error");
        }
      }
    );

您可以在subscribe中更好地处理401unhorized,下面是代码,您可以在组件本身中使用它

this.dynamic.getProfileDetails(this.userId, this.password).subscribe(
      v => (this.firstName = v.firstName),
      (err) => {
        // check if it is 401 and the token is invalid
        if (err.status == 401 && err.json().oauth2ErrorCode=='invalid_token') {
          console.log("Error Description " + err.json().oauth2ErrorCode);
          console.log("inside component error");
          //  refresh the token
          console.log("refresh the token")
          this._getNewToken.getNewTokenService().subscribe(
            v => {
              //  token is refreshed so retry the original request
              console.log("retry the original request with the new acces token")
              this.dynamic.getProfileDetails(this.userId, this.password).subscribe(
                v => (this.firstName = v.firstName)
              )
            },
            (refreshErr) => {
              if(refreshErr.status == 401 && refreshErr.json().oauth2ErrorCode=='invalid_token')
              {
                console.log("refresh token 401"+refreshErr.json().oauth2ErrorCode);
                this._router.navigate(['login']);
              }
              else if(refreshErr.status==400)
              {
                console.log("inside 400 "+refreshErr );
                this._router.navigate(['login']);
              }
              else
              {
                console.log("error des "+refreshErr );
                this._router.navigate(['login']);
              }
            }
          );



        }
        else{
               //serve  error logout from the app
                this._router.navigate(['login']);
               console.log("server error");
        }
      }
    );

有关详细的答案,您可以看到以下问题,感谢您的重播,下面的代码是我用来刷新此令牌的代码。_http.get(url,{headers:headers}).map((res:Response)=>{return res.json()})。catch(错误=>{if(error.status=401&&this.refreshtTokenCount有关详细答案,请参见下面的问题,谢谢重播,下面是我用来刷新此令牌的代码。_http.get(url,{headers:headers})。map((res:Response)=>{return res.json()})。catch(错误=>{if(error.status=401&&this.refreshTokenCount我想添加一条备注。例如,如果您使用JWT,您仍然需要一个有效的令牌才能刷新它。正如我在这个主题上研究过的那样,最佳做法是在令牌过期前n分钟/小时刷新它。我想添加一条备注。例如,如果您使用JWT,您仍然需要一个有效的令牌需要一个有效的令牌才能刷新它。正如我在这个主题上研究过的,最好的做法是在令牌过期前n分钟/小时刷新它。