Web API 更新的令牌认证

Posted

技术标签:

【中文标题】Web API 更新的令牌认证【英文标题】:Token authentication for Web API renewal 【发布时间】:2020-05-12 01:31:25 【问题描述】:

我正在编写一个 Web api,它将从后台服务调用以获取一些数据。经过一番研究,我决定使用 Json Web 令牌来实现这一目标,但我仍然对何时应该请求新令牌感到有些困惑。

假设我启动我的服务,我请求一个令牌,令牌在 15 分钟后过期,然后在 20 分钟后我用过期的令牌进行 api 调用。我会收到未经授权的错误或其他东西。

我的问题是:客户端如何知道何时请求新令牌?它应该在每次 api 调用之前请求一个新的吗?好像我错过了什么。也许我应该使令牌永久化并将其存储在数据库中?

谢谢

【问题讨论】:

【参考方案1】:

这个问题的答案有点特定于应用程序,但 OAuth 规范有一种“刷新令牌”机制,可用于授予新的“访问令牌”(通常包含在每个 API 请求中的令牌),而无需将用户发送到 UI 身份验证过程以让他们重新进行身份验证。因此,一旦您请求访问令牌,您将收到一个刷新令牌和一个访问令牌。这种方法允许在更短的时间内使用访问令牌。

这也可以在没有刷新令牌的情况下完成,但在这些情况下,访问令牌超时可能会更长,然后您会请求用户通过通常的 OAuth UI 流程重新进行身份验证。请注意,即使您确实有刷新令牌,也可以将刷新令牌设置为过期,这将需要用户再次通过 UI 重新进行身份验证。

在某些 API 中,您只需像往常一样发出 API 请求,如果您收到由 API 定义为指示访问令牌已过期的响应,则您可以发出 API 调用以刷新令牌(或完全请求一个新的,如果它已过期,或者您的 API 没有刷新令牌),然后使用新的访问令牌再次进行原始 API 调用。

API 还可以具有包含访问令牌的超时或到期日期/时间的响应。然后,客户端可以避免先发送初始 API 调用,而只需先发送刷新令牌调用。

在实现您的 API 时,您可能会使用这些方法中的任何一种。

以下是 OAuth 规范网站上的一些一般性讨论,以提供更深入的信息: https://www.oauth.com/oauth2-servers/making-authenticated-requests/

https://www.oauth.com/oauth2-servers/access-tokens/access-token-lifetime/

https://www.oauth.com/oauth2-servers/access-tokens/refreshing-access-tokens/

此外,这里有一个来自 Twitter API 的示例,它涉及显示访问令牌过期技术之一的响应代码(请参阅错误代码 89 下的“错误代码”部分,这意味着令牌已过期,您需要获取新的):

https://developer.twitter.com/en/docs/basics/response-codes

【讨论】:

你知道它是如何在移动应用上运行的吗?您只需登录一次即可访问 API。 这与在浏览器中的工作方式相同。但是对于移动应用程序,您可以使用刷新令牌(允许访问令牌在过期时刷新,因为刷新令牌通常具有更长的过期时间),甚至可能没有刷新令牌过期(或没有访问令牌过期),尤其是当应用程序与 API 由同一家公司制作时。【参考方案2】:

由于您的客户端是后台服务,您可以使用Oauth2 Client Credential Flow。当客户端请求访问受其控制的受保护资源时,您的后台服务可以仅使用其客户端凭据请求访问令牌。

通过这个流程,你不需要太关心令牌是否过期,如果客户端发送一个过期令牌到 web api,web api 验证令牌并创建令牌过期响应你的服务,你的服务检查状态码/response,直接向web api发送新的token请求获取新的访问token,不需要使用其他流程中使用的refresh token

【讨论】:

但这意味着我必须检查我所做的每个 API 调用的响应并检查是否存在“令牌过期”错误,然后请求新令牌并重新进行 API 调用。好像有很多重复的代码。 进行api调用时可以在客户端查看token是否过期。事实上,与在其他流程中使用刷新令牌相比,这是更清洁的方式。当然,您也可以使用代码流,但这需要用户登录并在您的客户端应用程序中处理令牌/刷新令牌【参考方案3】:

事实上,您的安全带应该准备好在获得未授权状态代码时请求任何令牌。我在测试中所做的是检查到期日期时间,如果足够接近,我会刷新或获取适用于您的身份验证的新令牌。此外,当获得未经授权的状态代码时,我的代码会刷新一次并保持计数。如果我得到另一个未经授权的代码,那么我在第二次尝试记录错误后返回错误或抛出异常。这对我来说很好。

【讨论】:

以上是关于Web API 更新的令牌认证的主要内容,如果未能解决你的问题,请参考以下文章

Web Api JWT 令牌认证

Web API 2,令牌认证和授权

Spotify Web API - 没有令牌认证的请求

使用 C# Web Api 和 axios 进行令牌认证

OAuth - 在“社交登录”中使用刷新令牌

AngularJS客户端路由和令牌认证与web api