【发布时间】:2019-06-03 16:31:38
【问题描述】:
我正在使用 Ionic 4 和 Angular 7。我正在尝试拦截 HTTP 请求并向标头添加一个令牌。问题是当我尝试从AuthService 检索它时,token 始终为空。我已将AuthService 添加到TokenInterceptor 构造函数,并注入AuthService。它们都不起作用。我究竟做错了什么?
AuthService.ts
@Injectable({
providedIn: 'root'
})
export class AuthService
{
public token: string;
public refreshToken: string;
constructor
(
private http: HttpClient,
private storage: StorageService,
)
{
this.API_URL = constants.API_URL;
this.OAUTH_URL = constants.AUTH_URL;
this.storage.getTokens().then(tokens => {
this.token = tokens.access_token;
this.refreshToken = tokens.refresh_token;
});
}
}
TokenInterceptorService
@Injectable()
export class TokenInterceptorService implements HttpInterceptor
{
constructor
(
private auth: AuthService,
)
{
}
setHeaders(req: HttpRequest<any>, token: string): HttpRequest<any> {
return req.clone({
setHeaders: {
Authorization: `Bearer ${token}`,
'Content-Type': 'application/json',
'Accept': 'application/json',
}
});
}
public intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>
{
console.log("token int", this.auth); // I CAN SEE TOKEN HERE
console.log("token int2", this.auth.token); // TOKEN IS UNDEFINED
return next.handle(this.setHeaders(req, this.auth.token));
}
}
App.Module.ts 中的Providers 数组
提供者:[ // .... 身份验证服务, API服务, { 提供:HTTP_INTERCEPTORS, useClass: TokenInterceptorService, 多:真, }, ]
我也尝试过注入 AuthService 但它不起作用
@Injectable()
export class TokenInterceptorService implements HttpInterceptor
{
private auth;
constructor
(
private injector: Interjector
)
{
this.auth = this.injector.get(AuthService);
}
setHeaders(req: HttpRequest<any>, token: string): HttpRequest<any> {
return req.clone({
setHeaders: {
Authorization: `Bearer ${token}`,
'Content-Type': 'application/json',
'Accept': 'application/json',
}
});
}
public intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>
{
console.log("token int", this.auth); // I CAN SEE THE TOKEN HERE ALONG WITH ALL OF THE OTHER VARIABLES AND DECLERATIONS IN `AUTHSERVICE`.
console.log("token int2", this.auth.token); // TOKEN IS UNDEFINED
return next.handle(this.setHeaders(req, this.auth.token));
}
}
我还尝试添加 AuthService 作为 TokenInterceptorService 的依赖项
providers: [
// ....
AuthService,
APIService,
{
provide: HTTP_INTERCEPTORS,
useClass: TokenInterceptorService,
multi: true,
deps: [AuthService],
},
// ....
]
【问题讨论】:
-
一方面,您似乎在 auth 服务(需要 HttpClient)、HttpClient(需要拦截器)和拦截器(需要 auth 服务)之间存在循环依赖关系。但是您能否详细说明 “我可以在这里看到令牌” 的含义?
-
我不确定如何解决循环依赖。如果我登录
this.auth,我可以看到AuthService中的所有变量,包括token。