热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:如果next.handle返回401(未授权),httpinterceptor中的异步续订令牌

篇首语:本文由编程笔记#小编为大家整理,主要介绍了如果next.handle返回401(未授权),httpinterceptor中的异步续订令牌相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了如果next.handle返回401(未授权),httpinterceptor中的异步续订令牌相关的知识,希望对你有一定的参考价值。



我正在使用HttpInterceptor将访问令牌应用于传出的httprequests。拦截器调用返回Observable的getUser(),将accesstoken添加到请求中。这一切都很好,花花公子。但我现在想要的是,如果请求返回401,我想刷新令牌然后再次处理请求。所以我捕获任何错误,并调用renewToken,它也返回Observable。但问题是它似乎没有访问renewToken的回调函数。因此,刷新的令牌永远不会被应用,并且api调用永远不会被重新执行,但是,renewToken会出现在我的网络选项卡中并且成功。

我确保renewToken()实际上是通过用renewToken()替换第一个getUser()调用来工作的。所以我的猜测是,我对rxjs的困惑以及如何连接长管等是出错的地方。

intercept(
request: HttpRequest,
next: HttpHandler
): Observable> {
if (request.url.includes(environment.apiBaseUrl)) {
return this.authService.getUser().pipe(
mergeMap((user: User) => {
console.log('in getUser call ' + user.expires_in);
if (user) {
request = request.clone({
setHeaders: {
Authorization: `Bearer ${user.access_token}`
}
});
}
return next.handle(request).pipe(
tap(
() => {},
(err: any) => {
debugger
if (err instanceof HttpErrorResponse) {
if (err.status === 401) {
return this.authService.renewToken().pipe(
mergeMap((renewedUser: User) => {
console.log('in renewToken call');
if (renewedUser) {
console.log(renewedUser.expires_in);
request = request.clone({
setHeaders: {
Authorization: `Bearer ${
renewedUser.access_token
}`
}
});
}
return next.handle(request).pipe(
tap(
() => {},
newErr => {
console.log(newErr);
this.authService.login();
}
)
);
}),
catchError(renewError => {
return Observable.throw(renewError);
})
);
}
}
}
)
);
})
);
} else {
return next.handle(request);
}
}

所以我想要的是刷新令牌并重做请求,如果我在第一次请求时未经授权,但我从不输入renewToken()的回调函数来添加新的accesstoken并重做请求。

另外,理想的情况是在用户上使用expired-property,如果它已过期,则刷新令牌然后只处理一次请求,但我不知道如何异步实现。

编辑:我很确定这与我无法通过tap功能以我认为可以返回的方式返回的事实有关。所以当试图返回renewToken或next.handle时,这是不可能的。尽管如此,如果第一个请求返回错误,我不知道如何实际更新令牌并使用新令牌重做请求


答案

我设法通过用catchError替换tap来解决我的问题,为什么我不确定。如果有人知道那么请解释。如果有人知道如何在通过检查用户的过期属性发送第一个请求之前刷新令牌,并使其异步,请告诉我。

return next.handle(request).pipe(
catchError((err: any) => {
if (err instanceof HttpErrorResponse) {
if (err.status === 401) {
return this.authService.renewToken().pipe(
mergeMap((renewedUser: User) => {
if (renewedUser) {
request = this.addBearerToken(
request,
renewedUser.access_token
);
}
return next.handle(request).pipe(
tap(
() => {},
newErr => {
console.log(newErr);
this.authService.login();
}
)
);
}),
catchError(renewError => {
return Observable.throw(renewError);
})
);
}
}
})
);


推荐阅读
author-avatar
小海豚1977
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有