如何添加auth token到自动生成的openapi代码中?

问题描述 投票:0回答:1

在我的 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 并手动完成所有操作就很容易,但应该有一种方法可以使用自动生成的代码来完成此操作。

blazor blazor-webassembly
1个回答
0
投票

找到了解决办法。这可行,但我不喜欢使用 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);
});
© www.soinside.com 2019 - 2024. All rights reserved.