代码之家  ›  专栏  ›  技术社区  ›  dave mankoff

为什么oauthv2既有访问令牌又有刷新令牌?

  •  545
  • dave mankoff  · 技术社区  · 14 年前

    OAuth2.0协议草案的第4.2节指出,授权服务器可以返回 access_token (用于通过资源验证自己)以及 refresh_token ,它仅用于创建新的 :

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

    访问令牌 而不是有一个 刷新\u令牌

    13 回复  |  直到 8 年前
        1
  •  499
  •   catchdave    13 年前

    刷新令牌的思想是,如果访问令牌受到损害,因为它是短暂的,攻击者有一个有限的窗口来滥用它。

    话虽如此

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

    下面是一篇讨论刷新令牌用法的好文章: OAuth Archives .

    刷新令牌。。。降低长期访问令牌泄漏的风险(在不安全的资源服务器上的日志文件中查询param、beta版或编码错误的资源服务器应用程序、将访问令牌放入cookie的非https站点上的JS SDK客户端等)

        2
  •  591
  •   sleske    6 年前

    Catchdave提供的讨论链接还有另一个问题 valid point (original, dead link) 由迪克·哈特制作,我认为除了上面写的内容之外,这里还值得一提:

    我记得刷新令牌是为了安全和撤销。

    撤销:

    实际上,在资源服务器和授权服务器是同一个实体,并且用户和它们之间的连接(通常)是同等安全的情况下,将刷新令牌与访问令牌分开是没有多大意义的。

    一般来说,令牌可以是指向服务器数据库中特定记录的随机标识符,也可以包含其自身的所有信息(当然,这些信息必须用 MAC

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

    len(users) x len(registered clients) x len(scopes combination) 记录。然后,每个API请求都必须命中数据库。尽管执行O(1)对这样的数据库进行查询非常简单,但是单点故障本身会对系统的可伸缩性和性能产生负面影响。

    具有长寿命刷新令牌和短命访问令牌的系统应该如何工作

    这里我们发布两个密钥:随机刷新令牌和数据库中相应的记录,以及签名的自包含访问令牌,其中包含过期时间戳字段。

    由于访问令牌是自包含的,因此我们根本不必访问数据库来检查其有效性。我们所要做的就是解码令牌并验证签名和时间戳。

    尽管如此,我们仍然需要保留刷新令牌的数据库,但是对该数据库的请求数通常由访问令牌的寿命定义(寿命越长,访问率越低)。

    刷新令牌部分消除了Access令牌数据库的单点故障(SPoF,Single Point of Failure),但也存在一些明显的缺点。

    1. “窗口”。事件“用户撤销访问”和“保证撤销访问”之间的时间范围。

    2. 客户机逻辑的复杂性。

      刷新令牌

      • 使用访问令牌发送API请求
      • 如果访问令牌无效,则失败并要求用户重新验证

      刷新令牌

      • 使用访问令牌发送API请求
      • 如果访问令牌无效,请尝试使用刷新令牌更新它
      • 如果刷新请求通过,则更新访问令牌并重新发送初始API请求
      • 如果刷新请求失败,请要求用户重新验证

    我希望这个答案是有意义的,并帮助一些人作出更深思熟虑的决定。我还想指出,一些著名的OAuth2提供商,包括github和foursquare,采用了没有刷新令牌的协议,并且似乎对此很满意。

        3
  •  223
  •   Andrew    6 年前

    最佳平衡 在骚扰用户之间 输入用户名/密码,并保留撤销潜在用户访问权限的权限 谢谢你的服务。

    想象一下这样的场景。您向用户发出3600秒的访问令牌,刷新令牌的时间比一天长得多。

    1. 用户是一个 好的 用户,他在家里,上下你的网站,在他的iPhone上购物和搜索。他的IP地址没有改变,在你的服务器上负载很低。像每分钟3-5页的请求。当访问令牌上的3600秒结束时,他需要一个带有刷新令牌的新令牌。在服务器端,我们检查他的活动历史和IP地址,认为他是一个人类和行为本身。我们授予他一个新的访问令牌以继续使用我们的服务。用户不需要再次输入用户名/密码,直到他达到刷新令牌本身的一天寿命。

    2. 用户是一个 粗心的 用户。他住在 美国纽约 波兰

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

    当我们试图平衡我们的工作、用户体验和令牌被盗的潜在风险时,您可以看到refresh令牌表现得非常完美。你的看门狗在服务器端可以检查多个IP的变化,api调用的频率,以确定用户是否应该是一个好用户。

    换言之,您还可以尝试通过在每个api调用上实现基本IP看门狗或任何其他措施来限制对被盗令牌/滥用服务的损害控制。但这是昂贵的,因为您必须读取和写入有关用户的记录,并会减慢服务器响应速度。

        4
  •  82
  •   Pang firemonkey    4 年前

    因此,刷新令牌的唯一目的是限制通过有线发送到auth服务的客户端凭据的使用。越短越好 TTL

        5
  •  64
  •   Community Marks    7 年前

    为了澄清一些困惑,你必须理解 client secret 以及 用户密码 ,这是非常不同的。

    这个 客户 是一个应用程序/网站/程序/…,由服务器支持,希望 验证 用户 通过使用第三方身份验证服务。客户机机密是一个(随机)字符串,该字符串对此客户机和身份验证服务器都是已知的。使用这个秘密,客户机可以通过身份验证服务器识别自己,接收 请求访问令牌。

    要获取初始访问令牌和刷新令牌,需要:

    • 客户端ID
    • 客户机密

    客户 使用以下信息:

    • 客户端ID

    这清楚地显示了区别:在刷新时,客户机通过使用其客户机机密接收刷新访问令牌的授权,并因此可以使用刷新令牌重新验证用户 相反 用户ID+密码。这有效地防止了用户必须重新输入他/她的密码。

    这也表明丢失刷新令牌没有问题,因为客户机ID和secret是未知的。它还表明,保持客户ID和客户机密是非常重要的 至关重要的 .

        6
  •  39
  •   Manicode    9 年前

    这个答案来自justinricher通过oauth2标准邮件列表。这是经他许可张贴的。


    另外,仅仅获得一个访问令牌并不意味着用户已经登录。实际上,用户可能已经不在了,这实际上是refresh令牌的预期用例。刷新访问令牌将为您提供代表用户访问API的权限,它不会告诉您用户是否在那里。

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

        7
  •  28
  •   mfaani    4 年前

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

    假设没有refresh键,让我们看一下这个示例:

    一座建筑物有80扇门。所有的门都是用同一把钥匙打开的。钥匙每30分钟换一次。在30分钟结束时,我必须把旧钥匙交给钥匙制造者,然后得到一把新钥匙。

    如果我是黑客,得到了你的钥匙,那么在30分钟结束时,我会把它快递给钥匙制造者,得到一把新钥匙。我将能够 打开所有车门,无论钥匙是否更换。

    问题:

    现在让我们来看看相同的例子,但是这次让我们假设有一个刷新键。

    一座建筑物有80扇门。所有的门都是用同一把钥匙打开的。钥匙每30分钟换一次。要获得新密钥,我不能传递旧的访问令牌。我只需要传递刷新键。

    在这30分钟里,我有多少次针对刷新键的黑客攻击机会?80? 没有。我只有一次黑客攻击的机会。在这段时间里,信使与钥匙制造者沟通。这就是攻击面。 我确实有80次破解钥匙的机会,但30分钟后就不行了。


    访问令牌泄漏是不好的,但一旦过期,对攻击者就不再有用了。刷新令牌泄漏的情况要严重得多,但可能不太可能。(我认为刷新令牌泄漏的可能性是否比访问令牌泄漏的可能性低得多,这是一个值得怀疑的问题,但正是这个想法。)

    关键是,访问令牌被添加到您发出的每个请求中,而刷新令牌仅在刷新流期间使用 所以MITM看到代币的可能性很小

    Heartbleed

    此外,如果授权服务器与处理其他客户机请求的应用程序服务器分离,那么该应用程序服务器将永远不会看到刷新令牌。它只会看到无法使用更长时间的访问令牌。

    分隔有利于安全。

    this awesome answer


    刷新令牌不是关于什么?

        8
  •  20
  •   Phil    12 年前

    客户可能在许多方面受到损害。例如,手机可以被克隆。访问令牌过期意味着客户端必须重新向授权服务器进行身份验证。在重新认证期间,授权服务器可以检查其他特征(IOW执行自适应访问管理)。

    刷新令牌只允许客户端重新身份验证,其中as-re-authorize强制与用户进行对话,许多人表示他们不愿意这样做。

    刷新令牌基本上适用于同一个位置,正常网站可能会选择在一小时左右后定期重新验证用户(例如银行网站)。由于大多数社交网站都不会对web用户进行重新身份验证,所以目前它的使用率并不高,那么他们为什么要对客户端进行重新身份验证呢?

        9
  •  15
  •   bitcoder    9 年前

    不能撤消访问令牌,只能撤消刷新令牌。

        10
  •  14
  •   Pang firemonkey    4 年前

    为什么不让访问令牌和刷新令牌一样长 没有刷新令牌?

    每个令牌都包含声明,声明可以包括用户名、角色或创建声明的提供者等任何内容。当令牌被刷新时,这些声明将被更新。

    如果我们更频繁地刷新令牌,显然会给我们的身份服务带来更大的压力;然而,我们正在获得更准确和最新的声明。

        11
  •  6
  •   Anbuselvan Rocky Adam Smaka    5 年前

    假设你成功了 access_token 持续很长时间,而且没有 refresh_token 访问令牌 他可以访问所有受保护的资源!

    但如果你有 的生存时间很短,所以黑客很难破解你的 访问令牌 Access_token 只能通过使用 刷新\u令牌 但同时也是 client_id client_secret ,这是黑客没有的。

        12
  •  3
  •   Kraming    7 年前

    而刷新令牌由授权服务器保留。访问令牌是自包含的,因此资源服务器可以在不存储它的情况下对其进行验证,从而节省了验证时的检索工作。 讨论中缺少的另一点是rfc6749第55页

    例如,授权服务器可以使用刷新令牌 每次访问都会发出一个新的刷新令牌的循环 令牌,它将向授权服务器通知违反行为。”

    我认为使用refresh token的关键是,即使攻击者设法获得refresh token、客户机ID和秘密组合。如果每次刷新请求都会产生新的访问令牌和刷新令牌,则可以跟踪攻击者的后续调用以获取新的访问令牌。

        13
  •  2
  •   Saptarshi Basu    8 年前

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

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

        14
  •  1
  •   Community Marks    4 年前

    首先,客户机通过授予授权来与授权服务器进行身份验证。

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

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

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