security - token机制 - token刷新机制




为什么OAuth v2具有访问权限和刷新令牌? (8)

OAuth 2.0协议草案的第4.2节指出,授权服务器可以返回一个access_token (用于验证资源)和refresh_token ,纯粹用于创建一个新的access_token

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

为什么都有? 为什么不直接将refresh_token为最后一次,并且没有refresh_token


为什么不直接将refresh_token设置为最后一次,并且没有refresh_token?

除了其他人提供的很好的答案之外,还有另外一个原因是为什么会使用刷新标记及其与索赔相关联。

每个标记都包含声明,其中可以包含来自用户名称,其角色或创建声明的提供者的任何内容。 当令牌刷新时,这些索赔被更新。

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


首先,客户端通过授权授权与授权服务器进行认证。

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

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

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

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

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

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


为了进一步简化英国电信的答案:当你通常不希望用户必须再次输入证书时,使用刷新令牌,但仍然希望能够撤销权限(通过撤销刷新令牌)

您无法撤销访问令牌,只能刷新令牌。


刷新令牌的想法是,如果访问令牌受到攻击,因为攻击者寿命短,攻击者可以利用有限的窗口来滥用访问令牌。

刷新令牌(如果受到攻击)无用,因为除了刷新令牌外,攻击者还需要客户端ID和密钥才能获得访问令牌。

话虽如此 ,因为每次对授权服务器和资源服务器的调用都是通过SSL完成的 - 包括原始客户端ID和秘密,当他们请求访问/刷新令牌时 - 我不确定访问令牌是如何“妥协“,而不是长期存在的刷新令牌和密码/密码组合。

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

以下是一个关于刷新令牌使用的好主意: OAuth Archives

上面的引用,谈到刷新令牌的安全目的:

刷新令牌......缓解长期存在的access_token泄漏的风险(在不安全的资源服务器上的日志文件中查询参数,测试版或编码不良的资源服务器应用程序,非https网站上的JS SDK客户端,将access_token放入cookie等)


尽管以上所有的重要答案,我作为一名安全硕士学生和程序员,他曾在eBay工作,当我看看买方保护和欺诈行为时,可以说分离访问令牌和刷新令牌在频繁使用用户名的骚扰用户/密码输入并保持权限,以撤销访问可能的滥用您的服务的权限。

想想这样的情景。 您发出3600秒的访问令牌的用户并刷新令牌的时间更长,为时一天。

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

  2. 用户是粗心的用户。 他住在美国纽约,病毒程序被关闭,并被波兰的一名黑客入侵。 当黑客获得访问令牌和刷新令牌时,他会尝试冒充用户并使用我们的服务。 但是,在短期访问令牌到期后,当黑客试图刷新访问令牌时,我们在服务器上注意到用户行为历史记录中出现了戏剧性的IP更改(嘿,这家伙登录美国,现在刷新访问波兰在3600s后)。 我们终止刷新过程,使刷新令牌本身无效并提示再次输入用户名/密码。

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

当我们试图平衡我们的工作,用户体验以及被盗取令牌的潜在风险时,您可以看到刷新令牌已经完美行事。 服务器端的看门狗可以检查IP更改,api调用的频率以确定用户是否是好用户。

另一个词是你也可以尝试通过在每个API调用基本的IP看门狗或任何其他措施实施来限制对被盗的令牌/服务滥用的损害控制。 但是,这是昂贵的,因为你必须读取和写入有关用户的记录,并且会降低服务器的响应速度。


由Catchdave提供的讨论链接还有另一个由Dick Hardt提出的有效论点 ,除了上面所写的内容外,我认为这里值得在此提及:

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

撤销:如果访问令牌是自包含的,则可以通过不颁发新的访问令牌来吊销授权。 资源不需要查询授权服务器以查看访问令牌是否有效。这简化了访问令牌验证并使其更容易扩展和支持多个授权服务器。 访问令牌有效时有一段时间,但授权被吊销。

事实上,在资源服务器和授权服务器是相同的实体并且用户与他们中的任何一个之间的连接(通常)同样安全的情况下,保持刷新令牌与访问令牌分离没有多大意义。

虽然正如引言中提到的那样,刷新令牌的另一个作用是确保访问令牌随时可以由用户撤销(例如,通过其配置文件中的Web界面),同时保持系统在同一时间的可扩展性。

通常,令牌既可以是指向服务器数据库中特定记录的随机标识符,也可以包含所有信息(当然,这些信息必须用MAC来签名,例如)。

具有长期存取令牌的系统应该如何工作

服务器允许客户通过发布令牌访问预定义范围内的用户数据。 因为我们想要保持令牌可撤销,所以我们必须在数据库中存储令牌以及被设置或取消设置的标志“撤销”(否则,您将如何使用自包含的令牌来执行此操作)?数据库可以包含尽可能多的len(users) x len(registered clients) x len(scopes combination)记录。 每个API请求都必须打到数据库。 虽然查询这样的数据库执行O(1)是非常简单的,但单点故障本身可能会对系统的可伸缩性和性能产生负面影响。

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

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

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

尽管如此,我们仍然需要保持刷新令牌的数据库,但是对这个数据库的请求数量一般由访问令牌的生命周期(寿命越长,访问速率越低)定义。

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

权衡

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

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

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

    没有刷新标记

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

    刷新令牌

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

我希望这个答案确实有意义,并帮助某人作出更深思熟虑的决定。 我还想指出,一些着名的OAuth2提供者,包括github和foursquare,都采用没有刷新令牌的协议,并且看起来很开心。


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

我们可以为此目的使用访问和刷新令牌。 当使用访问令牌调用API时,资源服务器会检查缓存中的访问权限。 如果有任何新的访问权限,它不会立即反映出来。 一旦访问令牌过期(例如在30分钟内)并且客户端使用刷新令牌来生成新的访问令牌,则可以使用来自DB的更新的用户访问权限信息来更新缓存。

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


这个答案来自Justin Richer通过OAuth 2标准正文邮件列表。 这是他的许可发布的。

刷新令牌的生存期取决于(AS)授权服务器 - 它们可以过期,被撤销等。刷新令牌与访问令牌之间的区别是受众:刷新令牌只返回授权服务器,访问令牌转到(RS)资源服务器。

此外,获取访问令牌并不意味着用户已登录。实际上,用户可能已经不在那里了,这实际上是刷新令牌的预期用例。 刷新访问令牌将使您可以代表用户访问API,但不会告诉您用户是否在那里。

OpenID Connect不仅可以为您提供来自访问令牌的用户信息,还会为您提供一个ID令牌。 这是针对客户端本身而不是AS或RS的单独数据。 在OIDC中,如果您可以获得新的ID令牌,您应该只考虑实际由协议“登录”的人。 刷新它不太可能。

欲了解更多信息,请阅读http://oauth.net/articles/authentication/





refresh-token