什么是刷新令牌的意义?

时间:2012-05-22 13:56:01

标签: authentication oauth

我必须承认我已经有很长一段时间没有这个问题,从来没有真正理解过。

说auth令牌就像是保险箱的钥匙,当它到期时它不再可用。现在我们给了一个魔术刷新令牌,可用于获取另一个可用的键,另一个......直到魔术键到期。那么为什么不将auth令牌的到期时间设置为与刷新令牌相同?为什么这么麻烦?

它的正当理由是什么,也许是历史原因?真的很想知道。感谢

4 个答案:

答案 0 :(得分:36)

前几天我被Taiseer Joudeh读了article,我觉得这很有用,他说:

我个人认为使用刷新令牌有三个主要好处:

  1. 更新访问令牌内容:如您所知,访问令牌是自包含令牌,它们包含有关经过身份验证的用户生成后的所有声明(信息),现在如果我们发出长期令牌(1个月)例如,对于名为“Alex”的用户并将其注册为“Users”角色,则该信息包含在授权服务器生成的令牌中。如果您稍后决定(他获得令牌后2天)将其添加到“管理员”角色,则无法更新生成的令牌中包含的此信息,您需要让他再次重新验证他自己因此授权服务器将此信息添加到此新生成的访问令牌中,这在大多数情况下都不可行。您可能无法覆盖获得长期访问令牌的用户。因此,要解决此问题,我们需要发布短期访问令牌(例如30分钟)并使用刷新令牌获取新的访问令牌,一旦获得新的访问令牌,授权服务器将能够为用户添加新的声明“Alex”在生成新的访问令牌后将其分配给“Admin”角色

  2. 撤消对经过身份验证的用户的访问:一旦用户获得长期访问令牌,只要他的访问令牌未过期,他就能够访问服务器资源,没有标准的方法可以撤销访问令牌,除非Authorization Server实现自定义逻辑,强制您将生成的访问令牌存储在数据库中,并对每个请求执行数据库检查。但是使用刷新令牌,系统管理员可以通过简单地从数据库中删除刷新令牌标识符来撤销访问权限,因此一旦系统使用已删除的刷新令牌请求新的访问令牌,授权服务器将拒绝此请求,因为刷新令牌不再可用(我们将详细介绍这一点。)

  3. 无需存储或询问用户名和密码:使用刷新令牌可让您在首次进行身份验证后只询问用户一次用户名和密码,然后授权服务器可以发出很长时间的生命刷新令牌(例如1年),除非系统管理员尝试撤销刷新令牌,否则用户将在所有这段时间内保持登录状态。您可以将此视为对服务器资源进行脱机访问的一种方法,如果您正在构建一个将由前端应用程序使用的API,这种情况非常有用,因为无法经常询问用户名/密码。

答案 1 :(得分:12)

引用的答案(通过@Anders)很有帮助,它声明:

  

如果妥协,它有效的时间窗口是有限的,但是   令牌通过SSL使用,因此不太可能受到损害。

我认为重要的一点是访问令牌通常会被记录(特别是当用作查询参数时,这对JSONP有帮助),所以最好让它们短暂存在。

服务提供商大规模实施OAuth 2.0还有其他一些原因:

  1. 如果可以不担心撤销,API服务器可以安全地验证访问令牌而无需DB查找或RPC调用。这可以带来强大的性能优势并降低API服务器的复杂性。如果您可以使用30m-60m(或任何访问令牌长度)的令牌撤销,那么最好。当然,API服务器也可以在过去一小时内保留内存中的令牌列表。

  2. 由于令牌可以有多个范围,可以访问多个不同的API服务,因此拥有短期访问令牌会阻止API服务的开发人员终身访问API服务B上的用户数据。区域划分对于安全

答案 2 :(得分:12)

我想补充一点另一种观点。

无需在每个请求上访问数据库的无状态身份验证

假设您要创建一个无状态(无会话)安全机制,可以对数百万用户进行身份验证,而无需进行数据库调用来进行身份验证。随着您的应用程序获得的所有流量,在每个请求上保存数据库调用是值得的!它需要是无状态的,因此它可以轻松集群并扩展到数百甚至数千台服务器。

使用老式会话,用户登录,此时我们从数据库中读取他们的用户信息。为了避免不得不一次又一次地读取它,我们将它存储在一个会话中(通常在内存或某些集群缓存中)。我们将会话ID发送到cookie中的客户端,该cookie附加到所有后续请求。在后续请求中,我们使用会话ID来查找会话,而会话又包含用户信息。

将用户信息直接放入访问令牌

但我们不想要会话。因此,不要将用户信息存储在会话中,而是将其放入访问令牌中。我们签署令牌,以便没有人可以篡改它并预先安装。我们可以在没有会话的情况下对请求进行身份验证,而无需为每个请求从数据库中查找用户信息。

没有会话......没办法禁止用户?

但没有会议有一个很大的缺点。如果这个用户被禁止怎么办?在旧方案中,我们只删除他的会话。然后他必须再次登录,这是他无法做到的。禁令完成。但在新的情况下,没有会话。那我们怎么禁止他呢?我们必须(非常礼貌地)要求他删除他的访问令牌。根据禁令列表检查每个传入的请求?是的,会起作用,但现在我们再次不得不拨打我们不想要的数据库电话。

与短期令牌妥协

如果我们认为用户可能仍然可以使用他的帐户,例如,被禁止后10分钟,我们可以创建一个在每个请求检查数据库之间的妥协情况登录时这就是刷新令牌进入的地方。它们允许我们使用具有短期访问令牌的无状态机制。我们无法撤销这些令牌,因为没有对它们进行数据库检查。我们只根据当前时间检查他们的到期日。但是一旦它们到期,用户将需要提供刷新令牌以获得新的访问令牌。此时我们检查数据库,看到用户已被禁止。因此,我们拒绝访问令牌的请求,禁令生效。

答案 3 :(得分:1)

简短回答:

刷新令牌允许令牌的范围/不同衰减时间。实际资源令牌是短暂的,而刷新令牌可以保持有效多年(移动应用程序)。这带来了更好的安全性(资源令牌不必受到保护)和性能(只有刷新令牌API必须检查对DB的有效性)。