OAuth 2.0如何安全地长期存储访问令牌

9
我正在使用OAuth 2.0 API。其流程如下:
  1. 在您的应用程序中,有一个按钮将您重定向到授权服务器(在我的情况下是API)。
  2. 您必须登录到API网站并授权给您的应用程序(按“允许”或“拒绝”按钮),或者如果您已经登录,只需授权给您的应用程序(按“允许”或“拒绝”按钮)。
  3. 您将被重定向回您的应用程序,并获得新的访问令牌以进行API调用。
一切都对我起作用,一切都很好,但我不明白如何处理给定的访问令牌,以便已经授权访问您的应用程序的用户不必再次授权访问。例如,当他几天后回到应用程序时。这会给用户带来不良体验(没有人想一遍又一遍地授权访问)。
注:我正在使用Quizlet API
1个回答

10
首先,访问令牌应该是短暂的。可以将其视为短暂的一次性凭据。如果您不相信,请查看此处链接的Azure AD令牌生命周期定义("Configurable token lifetime properties")。
建议使用定义短期有效的访问令牌,例如在1小时后过期。这样,您就可以避免存储它们的复杂性。您只需将它们保留在内存中并用它们来访问受保护的资源。
引用块中的问题是如何处理给定的访问令牌,以便已经授权访问您的应用程序的用户不必再次授权访问。例如,当他在几天后回到应用程序时。
好的,这里应该谈论Refresh tokens。根据OAuth 2.0规范,刷新令牌具有更长的生命周期。如果您查看我之前对Azure的引用,您会发现它们可以存活长达90天。对于Google,刷新令牌在6个月后过期(如果未使用)。仍然可以撤销它们。
现在,当您使用刷新令牌时,您不会使用它们来访问受保护的资源。应该交换刷新令牌以获取访问令牌。因此,如果有人窃取它们,他们仍然需要客户端身份验证(例如:客户端ID、重定向URI和客户端密钥)来获取访问令牌。但是,保护它们是必须的。

无论如何,RFC6819在第5.3.3节中定义了一些可能采用的方式来存储秘密(令牌是秘密)。您可以使用客户端存储机制或利用服务器后备存储令牌。

如果您的应用程序具有后端,则一种可能性是将cookie与令牌相关联。Cookie值可以是您在后端中存储的令牌的哈希值(可能在数据库中)。当后端接收到具有有效cookie值的请求时,它可以检索存储在其上的令牌。这与“记住我”功能非常相似。

如果您无法控制令牌的生命周期(它们默认为长寿)怎么办?

如果您可以轻松获得令牌,并且如果您可以妥协用户体验,请使用内存存储,在那里您将始终检索新令牌以进行新的访问。

如果您的应用程序具有一个可以在客户端之间保持状态的后端,请将令牌推送和存储在后端中。通过cookie /会话将客户端会话与令牌相关联。通过后端调用安全API,而不将存储的令牌暴露给客户端应用程序。


我明白了。目前,我只收到了过期时间为“315360000”的Bearer令牌,没有收到刷新令牌。默认的URL参数“prompt_approval=force” / “prompt=consent”是否是我没有收到它并且不断要求访问的原因?注意:我正在使用Quizlet APIPHP示例)。 - Tomeister
1
我已经仔细阅读了Quizlet的所有文档几遍,但没有找到任何关于使用OAuth配置的信息。事实上,他们声明提供的令牌有效期为10年:“Quizlet访问令牌有效期为10年,有效地为第三方应用程序提供永久访问权限(无需用户重新授权)”。 - Tomeister
但是用户不是必须为他使用的每个设备授予应用程序访问权限吗?比如说,用户使用平板电脑、智能手机和两种不同浏览器的个人电脑,那么他需要授权四次而不是一次,这不是 OAuth 的目标吗?或者,在我的情况下,没有办法提供最佳的用户体验了吗? - Tomeister
这会让事情变得复杂。根据您的授权服务器,如果您使用相同的浏览器,您可以获得基于浏览器的SSO行为(首次用户登录,授权服务器将设置cookie以识别最终用户,跳过后续授权请求的登录页面)。但除此之外很难说。据我了解,这超出了OAuth规范。 - Kavindu Dodanduwa
1
总的来说,我有哪些选择可以让用户在所有设备上仅授权一次?只有cookie吗? - Tomeister
显示剩余13条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接