如果仅被授予ClientId和ClientSecret并且没有刷新令牌,则为API续订访问令牌的最佳实践是什么?

时间:2019-06-22 12:27:03

标签: c# api asp.net-core oauth-2.0

我花了大约两周的时间来搜索.Net Core文档和教程,现在我正在构建自己的第一个.Net Core Web应用程序。因此,该应用程序基本上由基于搜索参数的在线API提取数据组成。没什么壮观的。现在,我的问题出在API用来限制对其数据访问的OAuth2中。这是我第一次遇到OAuth2并通常使用远程API,因此您可能会发现,我花了最后几天来阅读OAuth文档并了解API使用情况。我用来获取数据的API是Amadeus API,获得访问令牌的持续时间是30分钟。因此,在敲了几天脑袋并尝试通过各种不同的方式刷新访问令牌后,我发现Amadeus甚至不提供刷新令牌,我基本上应该使用ClientId和ClientSecret在访问令牌到期时更新访问令牌,或者当它快要到期时。我的应用没有任何用户身份验证,仅用于从API中获取数据。

所以我的问题是:

1)如果仅被授予ClientId和ClientSecret,更新访问令牌的最佳实践是什么?

2)是否可以通过使用一些内存数据而不依赖401响应来检查我的令牌是否已过期来自动执行此过程?

我的猜测是尝试使用Outgoing request middleware来尝试访问请求的特定数据或存储在内存中的数据,例如生成最后一个Access令牌的时间,然后决定是否应该更新它。发送请求。我的问题是我不太擅长此事,而且不确定是否可以访问此中间件中的HttpClient实例并使用HttpClient.SetBearerToken()方法更新其令牌。我也尝试过使用HttpContext,但是我不确定它在后台如何工作,而我发现的Microsoft文档非常稀缺。因此,另一个问题是:

3)我可以将HttpContext传递给this case中的自定义中间件,但可以使用它重写诸如SendAsync()之类的方法,然后根据我收集的intel,结合使用HttpClient.SetBearerToken( )在同一中间件中更新由HttpClientFactory生成的我的瞬时HttpClient实例?

任何帮助或建议都非常感谢!

1 个答案:

答案 0 :(得分:0)

  

1)如果您只是续订访问令牌的最佳实践是什么?   授予了ClientId和ClientSecret?

如果没有刷新令牌,则无法续订访问令牌。您唯一的选择是创建一个新的访问令牌,这意味着要通过OAuth授权流程返回。

  

2)有没有一种方法可以通过使用内存中的一些方法来自动执行此过程   数据并且不依靠401响应来检查我的令牌是否已过期?

也许可以破解一台机器的内存。但是,使用今天和明天仍然可以使用的受支持方法,答案是否定的。

  

3)在这种情况下,我可以像这样将HttpContext传递给自定义中间件吗?   使用它来覆盖诸如SendAsync()之类的方法,然后结合使用   基于我收集的信息,使用   相同中间件中的HttpClient.SetBearerToken()更新我的   由HttpClientFactory生成的瞬时HttpClient实例?

我不知道。由于对#1的回答是否定的,因此您可能无法。请注意,如果令牌已过期,则设置无记名令牌对您没有好处。令牌具有签名,除非您拥有私钥或一百万年的100万个CPU或发现漏洞/弱点,否则您将无法击败令牌。