Objective-访问令牌包含在请求中,以查看特定于用户的内容(例如配置文件,订单等)。现在,当从角度应用请求此类资源时,我正在检查访问令牌的有效性以及是否有效过期,然后从后端在拦截器中从后端返回特定代码-ERR_TKN_EXP,我检查此错误代码,并因此希望触发http请求以在后端上生成新令牌。这里的HTTP请求不是从Interceptor初始化的。
我尝试过的:
拦截器:
return next.handle(request).pipe(catchError(err => {
//const error = err.error.message || err.statusText;
const resError = err.error;
// Handle token expired case to generate a new token
if (err.status === 401 && resError.error.code == 'ERR_TKN_EXP') {
this.authService.refreshToken();
}
}))
AuthService-refreshToken函数。
refreshToken(){
this.generate_ac_tkn = true;
let refTokenParams = {
'auth-token' : this.ac_tkn,
}
alert("refreshToken");
return this.http.post(API_END_POINT + 'refresh-token', refTokenParams, {withCredentials: true})
.map((res: Response) => {
alert("refreshToken-Call");
});
}
根据上述代码,当服务器返回ERR_TKN_EXP代码时,拦截器将检查此代码,并相应地调用函数以刷新令牌。当我尝试跟踪问题时,“ refreshToken ”发出了警报,但没有看到“ refreshToken-Call ”的警报框,这意味着没有发生http发布请求。 / p>
任何人都可以建议这里出了什么问题。
谢谢。
答案 0 :(得分:0)
实际上,refreshToken
方法确实返回了一个Observable
,但是您没有subscribe
返回它,因此它不运行。
更改拦截器,使其也进一步传递refreshToken
的返回值。然后,Angular将在内部订阅拦截器的返回值。
return next.handle(request).pipe(catchError(err => {
const resError = err.error;
if (err.status === 401 && resError.error.code == 'ERR_TKN_EXP') {
return this.authService.refreshToken();
}
return EMPTY;
}))