2

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

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

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

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

4

3 回答 3

4

由于您正在使用IHttpClinetFactory(并且假设您也在使用Typed Client),您可以创建自己的HttpMessageHandler,它将在您发出任何请求之前触发,并通过 DITyped Client将其与您的链接链接,如下所示:typed client

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

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

如果令牌已过期或缓存中没有此类令牌,​​则发出一个新令牌并将其存储在缓存中。

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


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


更新:

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

services.AddTransient<TokenHandler>();
于 2019-05-19T18:52:57.000 回答
3

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

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

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

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

于 2019-05-19T13:08:35.780 回答
1

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

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

对于演示,请检查手动触发 IOptionsMonitor<>.OnChange

于 2019-05-20T02:28:09.510 回答