最近几天,我一直在阅读带有刷新和访问令牌的身份验证,但这是我找不到答案的一件事。假设发送了过期的访问令牌。后端应该自动刷新(如果提供了刷新令牌),还是应该仅在刷新端点进行刷新?
作为示例,请考虑以下两个身份验证流程:
前端不必担心刷新令牌,但是它仍然必须在每个请求之后查找响应头,以检查是否发送了新令牌。
refresh/
路由。 API检查令牌是否有效。如果一切正常,它将返回一个新的访问令牌。在每个请求之后,客户端必须检查令牌是否过期,如果已过期,则必须执行新请求以刷新令牌。向服务器发出了更多请求,但另一方面,由于auth路由仅负责处理访问令牌,而刷新令牌的处理则位于另一条路由中,因此更好地分离了责任。
我很难找到有关该主题的资源,因此我不确定要哪种解决方案更好,甚至我所描述的解决方案都是正确的。如果我必须选择一个,那么我将使用“自动刷新”,因为发出的请求更少,并且客户端可用性看起来更好,但是正如我所说的,我对此并不是100%的,因此我正在创建该线程
应该如何刷新访问令牌?
答案 0 :(得分:1)
我知道的OAuth2-协议的实现使用您在“手动刷新”下描述的流程。客户必须关心刷新。
客户端可以在每个请求之前检查access_token是否仍然有效,或者由于无效的令牌响应而在失败的请求之后进行刷新。
access_token生存期很短,因此,随每个请求发送它以及被窃听和滥用的风险是有限的。 refresh_token是长期存在的。如果您在每次请求时都发送refresh_token,则攻击者更有机会抓住它。
如果在每个请求中都发送了两个令牌,则不需要区分这两种类型。您只能使用一个长期存在的令牌。
答案 1 :(得分:1)
在我看来,您在这里缺少一个角色,即授权服务器(AS)的角色:
刷新令牌始终是客户的责任,并且仅将访问令牌发送到API。该API唯一的OAuth作业是验证访问令牌并根据其内容进行授权。
您的API可能正在执行授权服务器的工作。我打算将这些角色分开。如果有帮助,我的Messages Blog Post会在完整的UI和API解决方案中对消息进行详细介绍。
答案 2 :(得分:0)
我的经验是OAuth2 access_token请求不喜欢额外的数据,这意味着您将无法同时发送access_token和refresh_token。这将导致您将“手动刷新”场景描述为唯一的选择