【发布时间】:2017-12-26 01:41:43
【问题描述】:
所以我有我的身份验证服务,AuthService,它基本上有两种方法,一种从服务器获取新令牌,给定用户名和密码,另一种检索当前存储的令牌并在必要时在此过程中刷新令牌。 两者显然都依赖 HttpClient。即AuthService对HttpClient有依赖。让我们记住这一点。
另一个“服务”是一个 HttpInterceptor,我想拦截所有传出请求除了由 AuthService 发出的请求以添加授权标头(现在变脏了)。为了构成该标头,我们需要一个从 AuthService 获得的令牌。也就是说,AuthInterceptor(我的拦截器的名字)依赖于AuthService。据我所知,HttpClient 依赖于所有 HTTP_INTERCEPTORS。
关于如何打破这个圈子有什么想法或建议吗? 有没有办法让AuthService的HttpClient独立于AuthInterceptor?或者这是一个坏主意? (另外第三个函数将被添加到 AuthService 用于注销用户,其请求将被拦截并添加授权标头)
到目前为止,我发现了一个类似的issue,但建议的解决方法并不能解决我的问题,现在我在发送任何请求之前的引导过程中得到了无限递归。我已经处理了登录和令牌刷新请求被拦截以避免this 的情况,所以据我所知,这不是这里的问题。 这是plunk,其中包含我的代码概述。
摘自plunk:
@Injectable()
export class AuthInterceptor implements HttpInterceptor {
private auth: AuthService;
constructor(inj: Injector) {
this.auth = inj.get(AuthService);
}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
// Ignore if login or refresh request
if (req.url.includes('login')) {
return next.handle(req);
}
console.log('Intercepting request...');
return this.auth.getToken().map(token => {
const authHeader = 'Bearer ' + token;
const authReq = req.clone({setHeaders: {Authorization: authHeader}});
return authReq;
}).concatMap(newReq => next.handle(newReq));
}
}
【问题讨论】:
标签: angular