【发布时间】:2018-01-18 16:43:51
【问题描述】:
我正在尝试在 Angular5 中的 Http 拦截器中实现 access_token/refresh_token。我遇到的问题是在获得刷新令牌后我无法再次拨打电话。 因此,当我收到 401 错误(access_token 已过期)时,我使用 refresh_token 获得了一个新的 access_token,直到这里一切正常。接下来,我应该使用新的 access_token 再次进行初始调用,因此我尝试使用第二个来执行此操作
return next.handle(req);
但这不起作用。所以当我第一次点击并且令牌过期时,应用程序成功获取了一个新令牌并将其写入localStorage,但没有再次进行初始调用。如果我再次单击,则初始调用成功(使用在上一次单击时正确存储的新访问令牌)。就像我无法摆脱困境一样。也许我犯了一个愚蠢的错误。
下面是我的代码。请指教。谢谢!
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<any> {
let access_token, refresh_token;
if (localStorage.currentUser) {
access_token = JSON.parse(localStorage.currentUser).access_token;
refresh_token = JSON.parse(localStorage.currentUser).refresh_token;
if(access_token){
req = req.clone({ headers: req.headers.set('Authorization', 'Bearer ' + access_token) });
}
}
return next.handle(req)
.catch((error, caught) => {
if (this.isAuthError(error)) {
return this._auth.getRefreshToken().map((resp) => {
let user = resp.json();
localStorage.setItem('currentUser', JSON.stringify(user));
access_token = JSON.parse(localStorage.currentUser).access_token;
req = req.clone({ headers: req.headers.set('Authorization', 'Bearer ' + access_token) });
return next.handle(req);
});
} else {
return Observable.throw(error);
}
})
}
【问题讨论】:
标签: angular refresh-token