OAuth 2.0协议草案的第4.2节指示授权服务器可以返回两者 access_token (用于用资源来验证自己)以及 refresh_token, ,纯用于创建新的 access_token:

https://tools.ietf.org/html/rfc6749#section-4.2

为什么两者都有?为什么不只是做 access_token 持续到 refresh_token 并且没有 refresh_token?

有帮助吗?

解决方案

刷新代币的想法是,如果将访问令牌受到损害,因为它是短暂的,则攻击者的窗口有限,可以滥用它。

刷新令牌(如果受到损害)是毫无用处的,因为攻击者除了刷新令牌之外还需要客户ID和秘密以获得访问令牌。

话说回来, ,因为授权服务器和资源服务器都通过SSL完成 - 包括原始客户ID和秘密在请求访问/刷新代币时,我不确定访问令牌如何“妥协”长寿的刷新令牌和客户式/秘密组合。

当然,这与您不控制授权和资源服务器的实现不同。

这是一个很好的线程,讨论了刷新令牌的用途: Oauth档案.

上面的报价,谈论刷新令牌的安全目的:

刷新令牌...减轻长寿访问泄漏的风险(在不安全的资源服务器上的日志文件中查询param,beta或编码不佳的资源服务器应用程序,js sdk client在非https网站上,该网站上将access_token放在access_token上cookie等)

其他提示

Catchdave提供的讨论链接有另一个 有效点 (原始,死链) 由迪克·哈特(Dick Hardt)制作,我认为除了上面写的内容外,还值得在这里提及:

我对刷新令牌的回忆是为了安全和撤销。 <...>

吊销: 如果访问令牌是独立包含的,则可以通过不发布新的访问令牌来撤销授权。资源无需查询授权服务器即可查看访问令牌是否有效。这简化了访问令牌验证,并使缩放和支持多个授权服务器更容易。有一个时间窗口,访问令牌是有效的,但是撤销了授权。

确实,在资源服务器和授权服务器是相同的实体,以及它们之间的任何一个(通常)同样安全的情况下,保持刷新令牌与访问令牌分开没有太多意义。

虽然,如报价中所述,刷新令牌的另一个角色是确保用户随时撤销访问令牌(例如,通过其配置文件中的Web-Interface),同时保持系统可扩展。

通常,令牌可以是指向服务器数据库中的特定记录的随机标识符,或者它们可以包含所有信息(当然,必须使用此信息签名,并在 苹果电脑, , 例如)。

具有长寿命访问令牌的系统应如何工作

该服务器允许客户端通过发出令牌来访问预定义范围内的用户数据。由于我们想保持令牌可撤销,我们必须将设置或不设置的标志以及“撤销”的标志一起存储在数据库中(否则,您将如何使用独立的令牌来执行此操作? len(users) x len(registered clients) x len(scopes combination) 记录。然后,每个API请求都必须点击数据库。尽管对执行O(1)的数据库进行查询是非常微不足道的,但单点本身可能会对系统的可扩展性和性能产生负面影响。

长寿刷新令牌和短暂访问令牌的系统如何工作

在这里,我们发布了两个键:随机刷新令牌,上面有数据库中的相应记录,并签署了独立的访问令牌,其中包含到期时间戳字段。

由于访问令牌是独立的,因此我们根本不必点击数据库即可检查其有效性。我们要做的就是解码令牌并验证签名和时间戳。

但是,我们仍然必须保留刷新令牌的数据库,但是该数据库的请求数通常由访问令牌的寿命(寿命越长,访问率越低)来定义。

为了撤销特定用户的客户端访问权限,我们应该将相应的刷新令牌标记为“撤销”(或完全删除)并停止发布新的访问令牌。很明显,有一个窗口在此窗口中已被撤销,但其访问令牌可能仍然有效。

权衡

刷新令牌部分消除了访问令牌数据库的SPOF(单点),但它们有一些明显的缺点。

  1. 窗户”。事件“用户撤销访问”和“访问被撤销”之间的时间表。

  2. 客户逻辑的并发症。

    没有 刷新令牌

    • 发送带有访问令牌的API请求
    • 如果访问令牌无效,请失败并要求用户重新认证

    刷新令牌

    • 发送带有访问令牌的API请求
    • 如果访问令牌无效,请尝试使用刷新令牌更新它
    • 如果刷新请求通过,请更新访问令牌并重新介绍初始API请求
    • 如果刷新请求失败,请用户重新认证

我希望这个答案确实有意义,并帮助某人做出更周到的决定。我还要注意,包括Github和Foursquare在内的一些著名的OAuth2提供商无需刷新令牌,并且对此感到满意。

尽管上面有很多很好的答案,我还是一名安全硕士学生和程序员,他们以前在eBay上工作时在我研究购买者保护和欺诈时,可以说要分开访问令牌和刷新令牌 最佳平衡 在骚扰用户之间 频繁 用户名/密码输入并保留授权以撤销潜在的访问权限 虐待 您的服务。

想想这样的场景。您向用户发布3600秒的访问令牌,并有一天更长的时间刷新令牌。

  1. 用户是 好的 用户,他在家,开/关您的网站购物并在他的iPhone上搜索。他的IP地址不会改变,并且服务器上的负载非常低。像3-5页的要求每分钟请求。当他在访问令牌上的3600秒结束时,他需要一个带有刷新令牌的新秒。在服务器端,我们检查了他的活动历史记录和IP地址,认为他是一个人,并且表现出自己。我们给他一个新的访问令牌,以继续使用我们的服务。用户不需要再次输入用户名/密码,直到他已经达到了一天的刷新代币本身。

  2. 用户是 粗心 用户。他生活在 美国纽约 并让他的病毒程序关闭,并被黑客入侵 波兰. 。当黑客获得访问令牌和刷新令牌时,他试图模仿用户并使用我们的服务。但是,在短期访问令牌到期后,当黑客试图刷新访问令牌时,我们在服务器上注意到了用户行为历史记录的急剧变化(嘿,这个人在美国登录,现在在波兰进行刷新访问权限仅3600年代??)。我们终止刷新过程,使刷新令牌本身无效,并提示再次输入用户名/密码。

  3. 用户是 恶意 用户。他打算通过使用机器人每分钟致电1000倍的API来滥用我们的服务。直到3600秒之后,他就可以做得很好,当他试图刷新访问令牌时,我们注意到了他的行为,并认为他可能不是人类。我们拒绝并终止刷新过程,并要求他再次输入用户名/密码。这可能会破坏他的机器人的自动流动。至少让他不舒服。

当我们试图平衡工作,用户体验和潜在被盗代币的潜在风险时,您会看到刷新令牌的表现完美。服务器端的手表狗可以检查更多的IP更改,API调用的频率以确定用户是否应为好用户。

另一个词是,您还可以尝试通过在每个API上实施“基本IP Watch Dog”或任何其他措施来限制被盗令牌/滥用服务的损害控制。但这很昂贵,因为您必须读取和写入有关用户的记录,并且会减慢服务器响应的速度。

这些答案都不是核心原因刷新代币的核心原因。显然,您始终可以通过将客户凭据发送到Auth Server来获得新的访问/刷新对,这首先是如何获取它们的。

因此,刷新令牌的唯一目的是限制通过电线通过电线发送到Auth Service的客户凭据的使用。访问权限的TTL越短,必须使用客户凭据来获得新的访问权限,因此,攻击者必须妥协的机会越多(尽管无论如何无论如何,如果无论如何这可能是非常困难的,如果正在使用非对称加密来发送它们)。因此,如果您有一次性的刷新,则可以任意将访问权限的ttl缩小,而不会损害客户的凭据。

要清除一些混乱,您必须了解 客户秘密用户密码, ,非常不同。

客户 是由服务器支持的应用程序/网站/程序/... 认证 一种 用户 通过使用第三方身份验证服务。客户端秘密是该客户端和身份验证服务器已知的(随机)字符串。使用此秘密客户可以在身份验证服务器中识别自身,接收 授权 请求访问令牌。

为了获得初始访问令牌和刷新令牌,需要的是:

  • 用户ID
  • 用户密码
  • 客户端ID
  • 客户秘密

为了获得刷新的访问令牌 客户 使用以下信息:

  • 客户端ID
  • 客户秘密
  • 刷新令牌

这清楚地表明了不同的区别:刷新时,客户会通过使用其客户端秘密获得刷新访问令牌的授权,因此可以使用刷新令牌对用户进行重新认证 反而 用户ID +密码。这有效地阻止了用户必须重新输入他/她的密码。

这也表明,丢失刷新令牌是没有问题的,因为客户ID和秘密尚不清楚。它还表明,保留客户端ID和客户秘密是 重要.

这个答案来自OAuth 2标准的主体电子邮件列表贾斯汀·里奇(Justin Richer)。这是在他的允许下发布的。


刷新令牌的寿命取决于(AS)授权服务器 - 它们可以到期,被撤销等。刷新令牌和访问令牌之间的差异是受众:刷新令牌仅返回授权服务器,返回到授权服务器,访问令牌转到(RS)资源服务器。

另外,仅获取访问令牌并不意味着用户的登录。实际上,用户甚至可能不再存在,这实际上是刷新令牌的预期用例。刷新访问令牌将使您代表用户访问API,它不会告诉您用户是否在那里。

OpenID Connect不仅为您提供了来自访问令牌的用户信息,还为您提供ID令牌。这是针对客户本身的单独数据,而不是AS或RS。在OIDC中,如果您可以获得新的ID令牌,则只能考虑通过协议实际“登录”的人。令人耳目一新,这是不够的。

有关更多信息,请阅读 http://oauth.net/articles/authentication/

客户可以在许多方面被妥协。例如,可以克隆手机。拥有访问令牌到期意味着客户被迫重新认证到授权服务器。在重新认证期间,授权服务器可以检查其他特征(IOW执行自适应访问管理)。

刷新令牌只允许客户仅重新授权,因此重新授权与用户进行对话框,许多人表示他们不想做。

刷新代币基本上适合正常网站可能选择在一个小时左右后选择定期重新认证用户(例如银行网站)的同一地点。目前尚未高度使用它,因为大多数社交网站没有重新认证Web用户,那么为什么他们会重新认证客户端?

为了进一步简化BT的答案:当您通常不希望用户必须再次输入凭据,但仍希望使用功率能够撤销权限(通过撤销刷新令牌)时,请使用刷新令牌()

您不能撤销访问令牌,只有一个刷新令牌。

为什么不只是refresh_token且没有refresh_token的访问权限呢?

除了出色的答案外,其他人还提供了另一个原因,为什么要使用刷新令牌及其与索赔有关。

每个令牌都包含可以包括用户名称,其角色或创建索赔的提供商中的任何内容。由于令牌刷新,这些主张已更新。

如果我们经常刷新令牌,那么我们显然会对我们的身份服务施加更多压力,但是我们会得到更准确和最新的索赔。

假设你做 access_token 最后很长,没有 refresh_token, ,所以有一天,黑客得到这个 access_token 他可以访问所有受保护的资源!

但是如果你有 refresh_token, , 这 access_token的活时间很短,所以黑客很难砍你 access_token 因为在短时间后它将无效。Access_token 不仅可以使用 refresh_token 但也是 client_idclient_secret, ,黑客没有。

虽然刷新令牌由授权服务器保留。访问令牌是独立的,因此资源服务器可以在不存储它的情况下对其进行验证,从而在验证时节省了检索的努力。讨论中缺少的另一点是来自RFC6749#Page-55

“例如,授权服务器可以采用刷新令牌旋转,在其中发出新的刷新令牌,每个访问令牌刷新响应。先前的刷新令牌是无效的,但被授权服务器保留。攻击者和合法客户都将呈现无效的刷新令牌,这将为违规服务提供授权服务器。”

我认为使用刷新令牌的重点是,即使攻击者以某种方式设法获得了刷新令牌,客户ID和秘密组合。在随后的电话中,可以跟踪从攻击者获得新的访问令牌,以防万一对刷新的每个请求都会导致新的访问令牌和刷新令牌。

在两个高级开发人员(John Brayton和David Jennes)的帮助下,这一答案已被合并在一起。

使用刷新令牌的主要原因是减少攻击表面。

让我们假设没有刷新键,让我们介绍这个示例:

一栋建筑有80个门。所有门都用相同的钥匙打开。钥匙每30分钟更改一次。

如果我是黑客并获得您的钥匙,那么在30分钟结束时,我会暂时给Keymaker并获得新的钥匙。无论钥匙更改如何,我都可以连续打开所有门。

问题:在30分钟内,我有多少涉及钥匙的黑客机会?每次您使用钥匙时,我都有80个黑客机会(认为这是提出网络请求并传递访问令牌以识别自己)。所以这是80倍攻击表面。

现在让我们浏览相同的示例,但是这次让我们假设有一个刷新键。

一栋建筑有80个门。所有门都用相同的钥匙打开。钥匙每30分钟更改一次。如果我是黑客并得到您的钥匙,我可以使用30分钟,但是在30分钟结束时,将其发送给Keymaker没有价值。如果我这样做,那么Keymaker只会说此键已过期。为了能够扩展我的骇客,我将不得不将快递员攻击到Keymaker。快递员有一个独特的钥匙(将其视为刷新令牌)。

问题:在30分钟内,我对快递员有多少黑客机会? 80?不,我只有1个黑客机会。在此期间,快递员与Keymaker进行了沟通。这是1倍攻击表面。我确实有80个黑客机会违反钥匙,但是30分钟后它们不好。


服务器将根据凭据和(通常)JWT的签名来验证访问令牌。

访问令牌泄漏是不好的,但是一旦到期,它就不再对攻击者有用。刷新的象征性泄漏要差得多,但大概的可能性较小。 (我认为有空间质疑刷新令牌泄漏的可能性是否比访问令牌泄漏的可能性要低得多,但这就是想法。)

要点是,访问令牌添加到您提出的每个请求中

频率有助于攻击者。 heartbleed- 像SSL的潜在安全缺陷一样,客户端中的潜在安全缺陷以及服务器中的潜在安全缺陷都使泄漏成为可能。

此外,如果授权服务器与处理其他客户端请求的应用程序服务器分开,则该应用程序服务器将永远不会看到刷新令牌。它只会看到不会持续更长的时间的访问令牌。

隔间化对安全有益。


什么刷新代币无关?

通过刷新代币更新/撤销访问级别的能力是选择使用刷新令牌的副产品,否则,可以撤销独立的访问令牌或在到期并在用户获得新的标记时修改其访问级别”

让我们考虑一个将每个用户链接到一个或多个角色的系统,每个角色都链接到一个或多个访问权限。可以将此信息缓存以获得更好的API性能。但是,用户可能会发生变化,角色配置(例如,可以授予新的访问权限或可以撤销当前访问权限),并且应反映在缓存中。

我们可以为此目的使用访问和刷新令牌。当使用访问令牌调用API时,资源服务器会检查缓存是否访问权限。如果有任何新的访问赠款,则不会立即反映。访问令牌到期(例如30分钟内),并且客户端使用刷新令牌生成新的访问令牌,则可以使用DB的更新用户访问权限更新缓存。

换句话说,我们可以使用访问令牌将昂贵的操作从每个API调用中移动到使用刷新令牌的访问代币生成的事件。

首先,客户端通过授予授权赠款对授权服务器进行身份验证。

然后,客户端通过提供访问令牌向受保护资源的资源服务器请求资源服务器。

资源服务器验证访问令牌并提供受保护的资源。

客户端通过授予访问令牌来向资源服务器提供受保护的资源请求,其中资源服务器在其中验证它并为请求服务(如果有效)。此步骤继续重复直到访问令牌到期为止。

如果访问令牌到期,则客户端将使用授权服务器进行身份验证,并通过提供刷新令牌请求新的访问令牌。如果访问令牌无效,则资源服务器将向客户端发送无效令牌错误响应。

客户端通过授予刷新令牌通过授权服务器进行身份验证。

然后,授权服务器通过对客户端进行身份验证并发布新的访问令牌(如果有效)来验证刷新令牌。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top