问题描述
为了安全起见,我使用 Msal 包构建了一个 Angular 11 应用程序。
Msal 提供的拦截器会自动添加所需的 Authorization 标头和令牌。 但它仅在我使用提供给组件的 HttpClient 时才有效。如果我使用注入到服务的 HttpClient,则不会设置 Authorization 标头。
一切都像只为组件执行Http拦截器一样。
我的应用程序的结构是普通的:
- 应用
- 组件
- 我的组件
- 共享
- 服务
- 我的服务 组件也有专门的模块和服务。我试图在 app.module 和/或 service.module 的 providers 部分声明我的服务,但没有运气。 所有模块都导入到 app.module
- 服务
- 组件
有什么想法吗?
编辑 我的应用模块导入:
imports: [
browserModule,AppRoutingModule,browserAnimationsModule,LayoutModule,// Msal Module
MsalModule,HttpClientModule,...
]
HttpClientModule 未在别处导入
调用者类:
export class GameListComponent {
games: Game[];
constructor(private gameService: GameService,private http: HttpClient) { }
service() { // Token not sent
this.gameService.list().subscribe(response=>{
this.games = response;
console.log(this.games);
});
}
list() { // Token is correctly sent
this.http.get("https://localhost:5001/api/Game/All")
.subscribe(list=>console.log(list));
}
}
}
服务:
@Injectable({
providedIn: 'root'
})
export class GameService {
constructor(private http: HttpClient) { }
list():Observable<Game[]> {
return this.http.get<Game[]>("api/Game/All");
}
}
编辑2: 我忘了提到我的应用程序中有一个 proxy.conf。
在服务的情况下,使用 proxy.conf 并在正确的端口上完成调用,但没有授权标头。
如果我用完整地址+端口调用API,则不使用代理并添加aithorization标头(并且调用成功)。
还在看哪里不对...
解决方法
将服务放在共享模块中是错误的,因为注入器是为每个延迟加载的模块创建的,并且在您的情况下,某些服务被复制了。更常见的方法是将服务放入 /core
模块中,该模块只导入一次 - 到主应用模块。