HttpClient 不在服务上下文中发送令牌

问题描述

为了安全起见,我使用 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 模块中,该模块只导入一次 - 到主应用模块。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...