使用IHTTPClientFactory消费外部API时,在哪里存储访问和刷新令牌.网芯



我正在使用ihttpclientFactory使用Net Core 2.2。

用于将请求发送到API的访问令牌和刷新令牌已存储在AppSettings.json中。当请求返回403或401错误时,我会动态获得新的令牌,然后将其添加到请求的标题中。

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

与appsettings.json相比,存储访问和刷新代币的方法更好吗?

由于您使用的是IHttpClinetFactory(并且假设您也使用了键入客户端(,因此您可以创建自己的httpmessagehandler,该httpmessagehandler将在Typed Client提出的任何请求之前触发并与您的链接typed client通过DI这样:

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

TokenHandler内部,您可以检查请求是否在标题中具有令牌。如果不检查缓存(内存缓存(是否可用令牌,请验证令牌的寿命。

如果令牌已过期或在缓存中没有这样的令牌,请发布新的令牌并将其存储在缓存中。

我确定有更好的方法,但是我会做的。


注意:如果您的应用程序分布在多个服务器上,则使用分布式缓存而不是内存缓存。您可以通过DI轻松添加。


更新:

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

services.AddTransient<TokenHandler>();

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

您的Web服务需要将令牌保存在内存中(在单胎中(,并在需要时使用它。

当外部API想要一个新的令牌(例如,在doken expiratoin之后(时,您只需要询问新的singleton并更新您的Singleton。

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

通常,您应该将令牌存储在数据库中,以通过EF Core或任何其他数据提供商永久保存。

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

有关演示,请检查手动触发iOptionsMonitor&lt;>。onChange

最新更新