在我的 Blazor WebAssembly 项目中,我通过在 VisualStudio 中添加 ServiceReference 连接了外部 openapi api。之后会自动生成客户端代码。
在我的 Programm.cs 中我做了:
builder.Services.AddScoped<CustomApi>(sp => new CustomApi(builder.Configuration["BaseUrl"], new HttpClient() { }));
如果没有身份验证,这可以正常工作。对于身份验证,我编写了一个自定义 AuthenticationStateProvider 并将 jwt 令牌存储在 localStorage 中。
如何将令牌添加到 HttpClient 的 Authentication-Header 中?
自动生成的代码中没有任何内容可以在请求之前操作 HttpClient。看起来需要在 Programm.cs 中完成,但是我如何从 Program.cs 访问本地存储?它需要以某种方式为每个请求添加令牌,这样它就不会使用过期的令牌,但这是 Scoped 应该做的。
当然,只需注入一个 httpclient 并手动完成所有操作就很容易,但应该有一种方法可以使用自动生成的代码来完成此操作。
找到了解决办法。这可行,但我不喜欢使用 JSRuntime:
builder.Services.AddScoped<CustomApi>(sp =>
{
var httpClient = new HttpClient();
var jsRuntime = sp.GetRequiredService<IJSRuntime>();
var token = jsRuntime.InvokeAsync<string>("localStorage.getItem", "authtoken").Result;
if (!string.IsNullOrEmpty(token))
{
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
}
return new CustomApi(builder.Configuration["BaseUrl"], httpClient);
});