为什么OAuth的v2的同时拥有访问和刷新令牌?为什么OAuth的v2的同时拥有访问和刷新令牌?(W

2019-05-11 15:22发布

所述的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

Answer 1:

刷新令牌的想法是,如果一个访问令牌被攻破,因为它是短暂的,攻击者在滥用它在有限的窗口。

刷新令牌,如果泄密,是无用的,因为攻击者需要在除了刷新令牌以获得访问令牌,客户端ID和密码。

说了这么多 ,因为授权服务器和资源服务器都在每次调用通过SSL完成-包括原来的客户端ID和秘密,当他们请求接入/刷新令牌-我不确定的访问令牌是如何更多的“ compromisable”相比,长寿命的刷新令牌和客户端ID /秘密组合。

这当然是要实现,你不控制这两个授权和资源服务器上的不同。

这里是一个很好的线程谈论刷新令牌的用途: OAuth的档案 。

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

刷新令牌...减轻的风险长期存在泄漏的access_token(查询参数在日志文件中不安全的服务器资源,β-或编码不资源服务器的应用程序,在非HTTPS站点JS SDK客户端会将在的access_token上一个饼干等)



Answer 2:

链接的讨论,由Catchdave提供的,还有另外一个有效的点 (原件,死链接)由迪克·哈特,我相信这是值得一提的,除了是头上被写入这里所说的做:

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

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

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

虽然,在报价中提到,刷新令牌的另一个作用是确保访问令牌可以在任何时候通过用户撤销(通过他们的个人资料的网络接口,例如),同时保持系统的可扩展性,同时。

一般来说,代币可以是指向特定记录在服务器的数据库中随机标识符,也可以包含在自己的所有信息(当然,该信息已被签署,有MAC ,例如)。

如何与长期的访问令牌系统应工作

该服务器允许客户端发出的令牌来获得一个预先定义的一组范围内的访问用户的数据。 因为我们希望保持该令牌可撤销的,我们必须在数据库中标记存储与标志“撤销”被设置或取消(否则,你会怎么做,与自足令牌?)数据库可以包含多达沿len(users) x len(registered clients) x len(scopes combination)的记录。 然后每个API请求都必须访问数据库。 虽然这是相当琐碎进行查询,以这样的数据库进行O(1),失败本身的单点可以对系统的可扩展性和性能产生负面影响。

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

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

由于访问令牌是自包含的,我们没有在所有访问数据库,以检查它的有效性。 我们所要做的就是令牌解码和验证签名和时间戳。

尽管如此,我们还是要不断刷新令牌的数据库,但要求该数据库的数量通常是通过访问令牌(长寿命,较低的接入速率)的寿命定义。

为了撤销客户端从一个特定用户的访问,我们应当标注相应的刷新令牌为“撤销”(或者完全删除),并停止发放新的访问令牌。 很明显,虽然有在此期间刷新令牌已被撤销的窗口,但其访问令牌可能仍有效。

权衡

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

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

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

    刷新令牌

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

    刷新令牌

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

我希望这个答案有一定道理,帮助别人做更周到的决定。 我想还需要注意的是一些知名的OAuth2提供商,包括github上方正采取协议,而不刷新令牌,而且似乎高兴。



Answer 3:

尽管上述所有伟大的答案,我作为一个安全大师的学生,谁曾在eBay的工作时,我接过来一看变成买家的保护和欺诈程序员,可以说分离访问令牌和刷新令牌有频繁的用户名骚扰用户之间的最佳平衡点 /密码输入,并保持权力在手,撤销对服务的访问可能被滥用

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

  1. 用户是一个很好的用户,他是在家里,并得到开启/关闭你的网站购物,并在他的iPhone搜索。 他的IP地址不会改变,让你的服务器上的一个非常低的负荷。 像第3-5页的请求的每一分钟。 当他在访问令牌3600秒结束了,他需要一个新的与刷新令牌。 我们,在服务器端,检查他的活动历史和IP地址,觉得他是一个人,并且表现自己。 我们授予他一个新的访问令牌继续使用我们的服务。 用户将无需再次输入用户名/密码,直到他达到刷新令牌本身有一天寿命。

  2. 用户是粗心的用户。 他住在纽约,美国 ,得到了他的病毒程序关闭,并在波兰黑客入侵。 当黑客获得访问令牌和刷新令牌,他试图模仿用户和使用我们的服务。 但是,短版活的访问令牌到期,当黑客尝试刷新访问令牌之后,我们的服务器上,已经注意到在用户行为历史戏剧性的IP变化(嘿,在美国这个家伙的登录和现在刷新波兰访问经过短短3600 ???)。 我们终止刷新过程中,无效刷新令牌本身并提示重新输入用户名/密码。

  3. 用户是恶意用户。 他的目的是通过调用每分钟使用机器人1000次我们的API滥用我们的服务。 他能很好地这样做,直到3600秒后,当他试图刷新访问令牌,我们注意到他的行为,我认为他可能不是一个人。 我们反对并终止再生处理,并要求他重新输入用户名/密码。 这可能可能会破坏他的机器人的自动流程。 至少让他不舒服。

你可以看到刷新令牌已完全采取行动,当我们试图平衡我们的工作,用户体验和被盗令牌的潜在风险。 在服务器端你的看门狗可以检查比IP变化更多,API的调用频率来确定用户是否应是一个良好的用户与否。

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



Answer 4:

无论这些答案去的核心原因刷新令牌存在。 很明显,你可以随时通过发送客户端凭据auth服务器获得新的访问令牌/刷新标记对 - 这就是你如何让他们摆在首位。

因此,刷新令牌的唯一目的是限制使用在客户端凭证通过线路进入auth服务发送的。 访问令牌的的TTL越短,通常是客户证书将被用来获得新的访问令牌,因此更多的机会,攻击者必须妥协客户端凭证(尽管这可能是超高难度无论如何,如果非对称加密被用于向他们发送)。 所以,如果你有一个使用刷新令牌,可以使访问令牌任意小的TTL不影响客户端凭证。



Answer 5:

要清除了一些混乱,你必须了解的角色客户端密钥用户密码 ,这是非常不同的。

客户端是一个应用程序/网站/程序/ ...,通过一台服务器,想要通过使用第三方认证服务来认证 用户的支持。 客户端秘密是知道这两个客户端和认证服务器(随机)字符串。 使用这个秘密的客户端可以与认证服务器标识自己,接受授权请求访问令牌。

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

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

为了得到一个刷新访问令牌,但是客户端使用下列信息:

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

这清楚地表明的区别:刷新时,客户端接收的授权使用它的客户端秘密刷新访问令牌,以及使用该刷新令牌而不是用户ID +口令可以由此重新认证用户。 这有效地防止用户不必重新输入他/她的密码。

这也表明,失去了刷新令牌是没有问题的,因为客户端ID和秘密是不知道。 这也表明,保持客户端ID和客户端秘密的秘密是至关重要的



Answer 6:

这个答案是从贾斯汀通过OAuth的2个标准体电子邮件列表更丰富。 这是贴有他的许可。


刷新令牌的使用寿命达(AS)授权服务器 - 他们可以终止,撤销,等等刷新之间的差异令牌和访问令牌是观众:刷新令牌只能追溯到授权服务器,访问令牌转到(RS)资源服务器。

此外,刚刚访问令牌并不意味着用户的登录。事实上,用户甚至可能不存在了,这实际上是刷新令牌的预期使用情况。 刷新访问令牌会给你访问代表用户的一个API,它不会,如果用户没有告诉你。

ID连接不只是给你的用户信息从一个访问令牌,它也给你一个ID令牌。 这是数据的一个单独的一块执导的在客户端本身,而不是AS或RS。 在OIDC,你应该只考虑一个人通过协议实际上是“登录”如果你能得到一个新的ID令牌。 刷新也不太可能是不够的。

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



Answer 7:

客户可以在许多方面受到影响。 例如手机可以被克隆。 有一个访问令牌过期意味着客户被迫重新认证到认证服务器。 在重新认证,授权服务器可以检查其它特性(IOW执行自适应接入管理)。

刷新令牌允许一个客户端只能重新认证,那里的重新授权强制与许多人表示,他们宁愿不做用户的对话框。

刷新令牌适合基本在正常的网站可能会选择一个小时左右(如银行网站)后,定期重新验证用户在同一个地方。 它不是高度目前使用的,因为大多数社交网站不会重新验证的网络用户,那么他们为什么要重新验证客户端?



Answer 8:

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

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



Answer 9:

为什么不干脆让最后的access_token只要refresh_token并没有refresh_token?

除了伟大的答案其他人提供的还有另外一个原因,为什么会使用刷新令牌及其与索赔的事情。

每个令牌包含的权利要求可以包括从用户的名字,他们的角色或创建要求的供应商任何事情。 作为一个令牌更新这些声明进行更新。

如果我们更多的时候刷新令牌显然,我们把更多的应变我们的身份服务然而我们正变得越来越准确和最新的要求。



Answer 10:

假设你做的access_token持续很长时间,也没有refresh_token,于是在某一天,黑客得到这个和的access_token他可以访问所有受保护的资源!

但是,如果你已经refresh_token的的access_token的生存时间很短,因此黑客很难破解您的access_token,因为它会在较短的时间后失效。 ACCESS_TOKEN只能使用不仅refresh_token也受到CLIENT_ID和client_secret,该黑客并没有被检索回来。



Answer 11:

虽然刷新令牌由授权服务器保留。 访问令牌是自足,以便资源服务器可以验证它不保存它节省了检索的验证的情况下工作。 在讨论中失踪的另一点是从rfc6749#页55

“例如,授权服务器可以使用刷新令牌旋转在一个新的刷新令牌与每一个访问令牌刷新发行response.The以前更新过的凭证是无效的,但授权服务器保留。如果刷新令牌被攻破,随后通过使用无论是攻击者与合法的客户端,其中一人将呈现无效刷新令牌,这将告知违反的授权服务器“。

我认为使用刷新标记的整点是,即使攻击者以某种方式设法得到刷新令牌,客户端ID和秘密相结合。 随着后续调用摆脱攻击者新的访问令牌的情况下可以跟踪如果刷新结果在新的访问令牌每一个请求和刷新令牌。



Answer 12:

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

我们可以使用访问和刷新令牌这样的目的。 当API与访问令牌调用,资源服务器检查访问权限的缓存。 如果有任何新的访问授权,它不会立即反映。 一旦访问令牌到期(在30分钟内说了)和客户端使用刷新令牌来产生新的访问令牌,高速缓存可以从数据库更新的用户访问权限信息进行更新。

换句话说,我们可以使用访问令牌访问令牌生成的使用刷新标记的情况下每个API调用移动昂贵的操作。



Answer 13:

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

然后,客户机通过给访问令牌请求对受保护资源的资源服务器。

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

客户端使得通过授予访问令牌,其中资源服务器验证,并请求提供服务,如果有效的资源服务器保护的资源请求。 此步骤不断重复,直到所述接入令牌过期。

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

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

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



文章来源: Why Does OAuth v2 Have Both Access and Refresh Tokens?