如何在angular 2中api响应状态为401时实现用于刷新令牌的拦截器
我是Angualr 2的新手,当api响应为非授权(401)错误时,我在刷新令牌时面临问题。我们希望通过使用拦截器来实现这个概念。请提供任何输入或建议。在angular 2中,我们没有拦截器的概念,通过创建扩展标准http服务的自定义http服务也可以实现这一点。在应用程序模块中,您可以指示angular在任何需要http服务的地方使用自定义http服务。在angular 2中,我们没有拦截器的概念,通过创建扩展标准http服务的自定义http服务也可以实现这一点。在应用程序模块中,您可以指示angular在需要http服务的任何地方使用自定义http服务。下面的代码将有助于实现刷新令牌拦截器 `get(url:string):可观察{如何在angular 2中api响应状态为401时实现用于刷新令牌的拦截器,angular,Angular,我是Angualr 2的新手,当api响应为非授权(401)错误时,我在刷新令牌时面临问题。我们希望通过使用拦截器来实现这个概念。请提供任何输入或建议。在angular 2中,我们没有拦截器的概念,通过创建扩展标准http服务的自定义http服务也可以实现这一点。在应用程序模块中,您可以指示angular在任何需要http服务的地方使用自定义http服务。在angular 2中,我们没有拦截器的概念,通过创建扩展标准http服务的自定义http服务也可以实现这一点。在应用程序模块中,您可以指示a
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分钟/小时刷新它。