使用 IHttpClientFactory 使用外部 API 时存储访问和刷新令牌的位置。网络核心

Where to store Access and Refresh tokens when consuming external APIs using IHttpClientFactory. Net Core

我正在使用 IHttpClientFactory 从我的 Web API 向使用 Net Core 2.2 的外部 APIs 发送请求和接收 HTTP 响应。

用于向 API 发送请求的访问令牌和刷新令牌已存储在 appsettings.json 中。当请求 returns 403 或 401 错误时,我动态获取一个新令牌并将其添加到请求的 header。

但是如何使用新的访问和刷新令牌更新 appsettings.json 以便将其用于后续请求。

是否有比 appsettings.json 更好的存储访问和刷新令牌的方法?

假设您的客户端 WEB API 自动连接到您的外部 API(并且自动询问令牌),您不需要存储令牌和刷新令牌。

您的网络服务需要将令牌保存在内存中(在单例中)并在需要时使用它。

当外部 API 想要一个新令牌时(例如在令牌过期之后),您只需要请求一个新令牌并更新您的单例。

我们在多个项目中使用了这种工作方式,它很可靠。

因为您使用的是 IHttpClinetFactory(假设您使用的是 Typed Client as well), you can create your own HttpMessageHandler,它将在您的 Typed Client 和 link 与您的 typed client 通过 DI 像这样:

services.AddHttpClient<IServiceContract, ServiceImplementation>()
                .AddHttpMessageHandler<TokenHandler>();

TokenHandler 中,您可以检查请求是否在 headers 中有令牌。如果不检查缓存(Memory Cache)中的可用令牌,则验证令牌的生命周期。

如果token过期或者缓存中没有这样的token,则颁发一个新的并存入缓存。

我相信有更好的方法,但我会这样做。


注意:如果您的应用程序分布在多个服务器上,则使用Distributed Cache instead of the Memory Cache。您可以通过 DI 轻松添加。


更新:

您可以像这样注册您的处理程序:

services.AddTransient<TokenHandler>();

一般来说,您应该将令牌存储在数据库中,以供 EF Core 或任何其他数据提供程序永久保存。

如果您坚持要保存在appsettings.json,您需要实现自定义功能。

如需演示,请查看 Manually trigger IOptionsMonitor<>.OnChange