【发布时间】:2020-02-10 10:14:16
【问题描述】:
所以我创建了一个刷新令牌 http 拦截器,它从 API 中查找 401 错误,然后尝试刷新用户令牌。
那里有很多教程,这里有很多关于如何处理令牌刷新的教程,但是,如果不是全部的话,很多教程只是使用 inteceptor 中的服务,而我想使用 NGRX 调度操作。
我的操作(见下文)很简单,REFRESH_TOKEN 触发了一个调用 API 端点的效果,该端点有望为用户返回一个新的令牌(我还有其他效果来处理该操作的成功/失败、重定向或相应地保存数据)。
我对 inteceptor 的第一次尝试:
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
this.loaded$ = this.auth.pipe(select(selectAuthLoaded));
this.loading$ = this.auth.pipe(select(selectAuthLoading));
// @ts-ignore
return next.handle(request).pipe(catchError(error => {
if (error instanceof HttpErrorResponse && error.status === 401) {
return this.handle401Error(request, next);
} else {
return throwError(error);
}
}));
}
private handle401Error(request: HttpRequest<any>, next: HttpHandler) {
this.loading$.subscribe(isLoading => {
this.storage.getItem('refresh_token').subscribe(refreshToken => {
if (!isLoading && refreshToken) {
this.auth.dispatch(new RefreshToken(refreshToken));
} else {
return next.handle(request);
}
});
});
}
}
我在这里的想法是,如果是 401,请运行 handle401ERror 函数。这首先检查是否加载了身份验证状态,并从本地存储中获取用户刷新令牌(这很糟糕,一旦我确定了它就会更改为 COOKIE),如果加载了身份验证并且有一个刷新令牌然后调度REFRESH_TOKEN 操作。
这似乎导致以下错误:
You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
【问题讨论】:
-
很少有直接的想法...handle401error 不会返回任何内容,您在可以管道时订阅。试试this
-
嗨,感谢您的评论,正如我在帖子中所避免的那样,那里有很多教程(这是我也找到的),但他们似乎都只是使用该服务直接,而我想调度一个动作(你不能管道)。
标签: angular ngrx angular-http-interceptors