是否应将 OAuth 2.0 用于身份验证超时?



>移动应用程序的开发人员正在使用 OAuth 2.0 令牌的超时期限来检查应用程序何时必须向服务器重新进行身份验证。

这与我对正确使用 OAuth 2.0 代币的理解相冲突,尽管我不确定我是否正确。

我的理解:

OAuth 不是关于身份验证,而是关于授权,例如,此设备是否可以代表用户访问服务器上的某些资源。身份验证在逻辑上先于授权,并且是关于确认用户是他们所说的用户。

因此,用户提供凭据(用户名和密码),服务器验证是的,此用户是 Bob。

Bob 登录的应用程序想要访问 Bob 已通过身份验证的服务器上的某些资源 - 例如来自 API 的数据。因此,应用程序请求 OAuth 令牌并被授予,其属性之一是它存在的时间。应用程序和服务器交换密钥,应用程序和服务器之间的数据使用密钥进行加密。

读取明文通信的入侵者将无法在没有密钥的情况下对其进行解码。但是,如果入侵者能够获得密钥,他们将能够获得密钥。

这就是 OAuth 令牌生命周期结束的用武之地。我们不想永远使用相同的OAuth令牌(密钥),因为如果入侵者能够获得该令牌,他们可以永远破坏我们的通信。但是,如果我们每 x 小时刷新一次令牌,那么它们只能使信息老化 x 小时(假设 2 小时)。

我认为 OAuth 令牌过期时间不应与用户保持身份验证的时间相关联。这完全取决于开发人员。在我们的例子中,如果用户有一些设备安全性(例如密码),那么我们可以让他们长时间(例如几个月)保持身份验证。如果他们没有设备安全性,那么我想强制他们在合理的不活动时间(可能是 24 小时)后重新进行身份验证。

这是否正确,如果不正确,哪些部分。

提前谢谢。

布莱恩

您对OAuth 2.0的理解是正确的。以非常抽象的方式,协议定义了获取令牌的方法,客户端可以使用令牌与受保护的终结点进行通信。

RFC6749强制要求在与授权服务器通信(令牌获取)以及针对 API/受保护终结点使用它(RFC6750 中定义的持有者令牌使用)时使用 TLS。这可以保护令牌免受传输中攻击。

建议使用 OAuth 访问令牌的生存期较短。这是为了避免令牌窃取以及客户端可以完成的令牌滥用。您可以从RFC6819阅读有关最佳实践的更多信息。可以从此处读取访问令牌生存期详细信息。

现在关于选择正确的生命周期。正如你已经发现的那样,使用刷新令牌是续订访问令牌的理想方法,而不是拥有长期的访问令牌。例如,刷新令牌的有效期为几天,而访问令牌的有效期仅为几个小时。

但请注意以下几点,

+应用程序是否可以获取和保护刷新令牌

例如,SPA 无法获取刷新令牌,因为它无法将其存储较长时间。在这种情况下,您需要寻找替代机制来续订访问令牌。

+访问令牌是否用于外部域

对外部 API 使用访问令牌会增加威胁向量。例如,如果您有一个封闭的系统(客户端和后端在一个域中),那么您可能会考虑增加访问令牌的生存期。但不是像 24 小时这样的长时间。!

+单点登录

您可以获得授权服务器的帮助,以在浏览器之上维护 SSO 行为,而不是使用持久的访问令牌。这类似于您在现代登录对话框中观察到的"记住我"。登录后,浏览器会维护一个持续一段时间的cookie(例如:- 一周)。下次使用 OAuth 令牌获取流时,您的授权服务器会检测到此登录状态,从而跳过登录对话框。当然,这种方法必须根据确切的安全/策略要求来决定。

总之,使用缩短生存期的访问令牌。使用刷新令牌是令牌续订所需的方法。但根据情况,您也可以选择替代方案。

最新更新