为什么访问令牌过期?

我刚刚开始使用Google API和OAuth2。 当客户授权我的应用程序时,我得到一个“刷新令牌”和一个短暂的“访问令牌”。 现在,每当访问令牌过期,我可以将我的刷新令牌发送给Google,他们会给我一个新的访问令牌。

我的问题是什么是访问令牌到期的目的? 为什么不能有一个持久的访问令牌,而不是刷新令牌?

另外,刷新令牌是否过期?

有关Google OAuth2工作stream程的详情,请参阅使用OAuth 2.0访问Google API 。

这是非常具体的实现,但总体思路是允许提供商发行具有长期刷新令牌的短期访问令牌。 为什么?

  • 许多供应商支持安全性非常弱的持票人令牌。 通过使它们短暂并需要刷新,它们限制了攻击者滥用盗取令牌的时间。
  • 大规模部署不希望每个API调用都执行一次数据库查找,相反,他们发出可以通过解密validation的自编码访问令牌。 但是,这也意味着无法撤销这些令牌,所以短时间发放并且必须刷新。
  • 刷新令牌需要客户端authentication,这使得它更强大。 与上面的访问令牌不同,它通常是通过数据库查询来实现的。

有两种情况可能有助于说明访问和刷新令牌的目的,以及在deviseoauth2(或任何其他authentication)系统时的工程权衡:

Web应用场景

在Web应用程序场景中,您有几个选项:

  1. 如果您有自己的会话pipe理,请在会话状态服务中将会话状态下的会话标识存储access_token和refresh_token。 当用户请求访问资源的页面时,请使用access_token,并且如果access_token已过期,请使用refresh_token获取新页面。

我们假设有人设法劫持你的会话。 唯一可能的是请求你的页面。

  1. 如果您没有会话pipe理,请将access_token放在cookie中,并将其用作会话。 然后,每当用户请求从您的Web服务器的页面发送access_token。 如果需要,您的应用服务器可以刷新access_token。

比较1和2:

在1中,access_token和refresh_token仅在授权服务器(您的情况下为google)和您的应用服务器之间的通路上传输。 这将在一个安全的渠道上完成。 黑客可以劫持会议,但他们只能与您的networking应用程序进行交互。 在2中,黑客可以将access_token带走,并向用户授权访问的资源形成自己的请求。 即使黑客获取了access_token,他们也只能有一个短的窗口访问资源。

无论哪种方式,只有服务器知道refresh_token和clientid / secret才能从Web浏览器获得长期访问权限。

假设您正在实现oauth2,并在访问令牌上设置了一个很长的超时时间:

1)由于它隐藏在应用程序服务器中,所以短的和长的访问令牌之间没有太大的区别。 2)有人可以在浏览器中获取access_token,然后长时间使用它直接访问用户的资源。

移动场景

在手机上,我知道有几个情景:

  1. 在设备上存储clientid / secret,让设备协调获得对用户资源的访问。

  2. 使用后端应用程序服务器来保存客户/秘密,并进行编排。 使用access_token作为一种会话密钥,并在客户端和应用服务器之间传递它。

比较1和2

1)一旦你有设备clientid /秘密他们不再是秘密。 任何人都可以反编译,然后开始行动,就像他们是你一样,当然用户的许可。 access_token和refresh_token也在内存中,可以在受感染的设备上访问,这意味着有人可以在没有用户提供凭据的情况下充当您的应用。 在这种情况下,由于refresh_token与access_token位于同一位置,因此access_token的长度对可破解性没有影响。 在2)的clientid /秘密,也不刷新令牌是妥协。 在这里,access_token过期的长度决定了黑客能够访问用户资源多长时间,如果他们掌握了它。

到期长度

这取决于你使用auth系统保证你的access_token过期多长时间。 如果这对用户来说特别有价值,那么它应该很短。 有价值的东西,可以更长。

有些人喜欢谷歌不会过期的refresh_token。 有些像堆栈一样。 关于到期的决定是用户易用性和安全性之间的折衷。 刷新令牌的长度与用户返回长度有关,即将刷新设置为用户返回应用程序的频率。 如果刷新标记没有过期,那么它们被撤销的唯一方法是显式撤销。 通常情况下,login不会被撤销。

希望相当长的职位是有用的。

这本质上是一个安全措施。 如果您的应用程序受到攻击,攻击者将只能访问短期访问令牌,无法生成新的访问令牌。

刷新令牌也过期了,但是它们应该比访问令牌长得多。

除了其他响应:一旦获得,访问令牌通常与每个请求一起发送到受保护的资源服务器。 这会引起访问令牌窃取和重放的风险(当然假设访问令牌是“持有者”types,而不是MAC)。

在现实生活中,这些风险的例子:

  • 资源服务器通常是分布式应用程序服务器,与授权服务器(较低的SSL / TLSconfiguration,较less的硬化等)相比,通常具有较低的安全性。 另一方面,AS通常被认为是关键的安全基础设施,并且会受到更严重的强化。

  • 访问令牌可能出现在HTTP跟踪,日志等中,为了诊断目的在资源服务器上进行合法收集。 这些痕迹可以在公共或半公共场所(bug追踪器,服务台等)交换。

  • 后端RS应用程序可以外包给或多或less值得信赖的第三方。

另一方面,刷新令牌通常只在线路上传输两次 ,并且总是在客户端和授权服务器之间传输:一次在客户端获得时,一次在刷新期间被客户端使用时(有效地“刷新”之前的刷新令牌)。 这对于截取和重播来说是一个极其有限的机会。

最后想到的是,刷新令牌对被入侵的客户端提供很less的保护(如果有的话)。