oAuth服务器是否应该为同一客户端请求提供相同的accessToken?

时间:2017-02-22 19:47:42

标签: oauth oauth-2.0

我正在开发一个oAuth2服务器,我偶然发现了这个问题。

让我们假设我的令牌设置为在一小时内到期。在此时间范围内,某些客户端使用相同的client_id和相同的redirect_uri进行了五十次隐式身份验证。一切都基本相同。

我应该在第一次请求中为后续版本生成相同的accessToken,直到它过期,还是应该在每次请求时发出新的accessToken

发送相同令牌的好处是我不会在服务器上留下客户端的陈旧和未使用的令牌,从而最大限度地减少了攻击者试图猜测有效令牌的窗口。

我知道我应该限制速度而且我正在这样做,但是在数千台不同机器发生大型僵尸网络攻击的情况下,某些限制不会立即生效。

但是,我不确定这个解决方案的缺点,这就是我来到这里的原因。这是一个有效的解决方案吗?

4 个答案:

答案 0 :(得分:4)

我宁愿说 - 不。

原因:

  1. 您绝不应在授权服务器端以纯文本格式存储访问令牌。访问令牌是凭证,应存储哈希值。盐渍可能没有必要,因为无论如何它们都是生成的字符串。见OAuth RFC point 10.3
  2. 根据您处理后续请求的方式 - 知道某个资源所有者正在使用您的服务并重复使用已使用客户端ID的请求的攻击者。这样攻击者就可以冒充资源所有者了。如果您确实返回相同的令牌,那么至少要确保每次都对资源所有者进行身份验证。
  3. "州"怎么样?参数?你会考虑要求是"相同"如果状态参数不同?如果没有,则僵尸网络攻击每次只会使用不同的状态,并强制您发布新令牌。
  4. 作为补充 - 通常通过应用程序逻辑防御僵尸网络攻击是非常困难的。将您的AS暴露给互联网的服务器应该注意这一点。在应用程序层,你应该注意它不会受到小带宽攻击的影响。

答案 1 :(得分:3)

如果它仍然有效,您可以返回相同的access_token,对此没有任何问题。唯一的缺点可能在于您使用Implicit流,因此在URL片段中重复发送 - 相同的,有效的 - 访问令牌,该片段被认为不如使用例如授权码流程。

答案 2 :(得分:2)

作为一个拇指规则永远不会重复使用密钥,如果密钥捕获 ,这将为所设计的系统带来额外的安全性

答案 3 :(得分:1)

您可以在正确身份验证后发送其他 访问令牌,并在访问令牌上发送刷新令牌 >

一旦您的访问令牌 到期,您应该通知用户,用户应该重新请求提供一次性的新访问令牌 -use 刷新令牌以前提供给他们跳过重新身份验证的需要,你应该提供新的访问令牌刷新令牌

要使用假的刷新令牌来抵御攻击,您应该在几次警告后将它们与原始IP一起列入黑名单。

PS :永远不要使用可预测的令牌。通过使用完全随机的长字母数字字符串,Atleast使暴力攻击极为困难。如果您使用的是php,我会建议bin2hex(openssl_random_pseudo_bytes(512))