Web API更新的令牌认证

问题描述 投票:0回答:3

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

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

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

谢谢

c# oauth jwt asp.net-core-webapi bearer-token
3个回答
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


1
投票

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

通过此流程,您无需太在乎令牌是否过期,如果客户端将过期的令牌发送到Web api,Web api会验证令牌并创建令牌过期,则响应您的服务,您的服务会检查状态代码/响应,直接向Web api发送新的令牌请求以获取新的访问令牌,无需使用在其他流中使用的refresh token


0
投票

我想您的目标是在保持安全性的同时启用非常长的会话。许多人建议,只要AT过期,就使用长寿命的刷新令牌(RT)来获取新的访问令牌(AT)。尽管这使您可以拥有很长的会话,但与仅拥有一个长访问令牌的简单流程相比,它在安全性方面几乎没有作用(因为如果有人窃取了刷新令牌,则可以使用该令牌来获得访问权限)帐户的使用期限很长,无论访问令牌的生命周期如何。

我建议您应该使用“旋转刷新令牌”-每当您使用RT来获取新的AT时,API也会返回新的RT(最终将撤销旧的RT)。这条路。这也使您能够可靠地检测会话劫持(请参阅this RFC)。

所以现在要回答您的问题,您应该执行以下操作:

  • 在用户登录时,您的后端会将RT和AT发送到您的前端(移动或Web应用)

  • 您的前端应使用AT(可以是JWT)进行API调用,直到过期为止。有效期约为30分钟。

  • 当AT过期时,您的后端将向您的前端抛出会话过期错误。之后,您的前端应使用其RT调用刷新API以获得新的AT和新的RT。这可以通过网络和android上的拦截器完成(请参见网络的this示例和android的this示例)。

  • 获得新令牌后,前端应使用新的访问令牌再次调用原始API。

  • 要注销用户,只需撤销刷新令牌和访问令牌(如果AT不是JWT的话。

这样,您可以维持非常长的会话,并维持高级别的安全性。安全的关键在于使用旋转刷新令牌(有关更多详细信息,请参见this blog post

关于OAuth的注释:

将OAuth与常规会话管理相混淆非常简单。 OAuth是专门用于委派给第三方服务的,而在会话管理中,它只是在前端和后端之间维护经过身份验证的会话。 OAuth表示您永远不要将刷新令牌存储在前端,它们是正确的。但这仅适用于第三方代表团(例如fb登录)。但是,在会话管理中不是这种情况(尤其是在使用旋转刷新令牌的情况下)。

我希望这会有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.