微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 模块中,该模块只导入一次 - 到主应用模块。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?