【问题标题】:flickr oauth api returns signature invalid error at random timesflickr oauth api 随机返回签名无效错误
【发布时间】:2012-09-17 21:50:14
【问题描述】:

我有一个网络应用程序,它可以向他们的 flickr api 验证用户。它利用 OAuth 1.0 并且大多数时间都可以进行身份​​验证。但是在随机时间,在完全随机的时间,flickr 无法识别我的签名。它在请求请求令牌时返回无效签名错误。但是下一次尝试中的相同代码会正确带回请求令牌。

我怀疑这与我生成随机数或时间戳的方式有关。否则它不应该在连续尝试中起作用,对吧?

这就是我生成随机数和时间戳值的方式:

$nonce   = md5(microtime(true).rand());
$timestamp  = mktime();

这有什么问题吗?有没有更好的方法来生成 nonce 值?这种随机故障非常令人困惑。我想不出任何其他原因导致我收到无效错误,随机!


跟进

根据 Jan Gerlinger 的建议,我将 mktime() 更改为 time()。它肯定减少了发生的频率。但它仍然会在随机时间给出无效签名错误,在更改为 time() 后很少会出现,我可能会补充。

所以,我假设时间戳(mktime)是导致这些随机错误的问题之一。但是那里仍然有其他问题。也许在随机数生成?

【问题讨论】:

  • 我建议记录所有请求以及它们是成功还是失败;然后尝试从中找到一种模式。
  • @Jack 我试图从中找出一种模式。但正如我所说,它发生在完全随机的时间。
  • 没有什么是真正随机的;如果您说第二次尝试时使用相同的随机数和时间,则可能是完全不同的东西,例如临时服务器错误。

标签: php oauth flickr nonce


【解决方案1】:

Depending on your PHP version,你应该使用time() 而不是mktime()

对于随机数,documentation 说:

nonce 是一个随机字符串,由客户端唯一生成,以允许服务器验证以前从未发出过请求,并有助于防止通过非安全通道发出请求时的重放攻击。在具有相同时间戳、客户端凭据和令牌组合的所有请求中,nonce 值必须是唯一的。

如果rand() 在一微秒内两次返回相同的值,那么您将获得两次相同的随机数。由于 MD5 冲突,生成 MD5 哈希也不能保证您获得唯一值。这里更好的方法是使用global counter for the nonce

但是,如果您经常遇到此错误,则 nonce 可能不是您的问题,因为这些冲突不应该经常发生。

有时无效签名错误的问题是客户端的服务器时间与提供者的服务器时间不同,因此您可以通过时间同步检查您的服务器上是否发生了一些奇怪的事情。

【讨论】:

  • 非常感谢 Jan 的帮助。让我试试。我会返回结果。
  • 关于时间同步;有什么方法可以确保我的服务器时间与 flickr 服务器时间同步?
  • 嗯,flickr 的服务器肯定是使用一些 NTP 服务器同步的,所以你能做的最好的事情是使用ntpdate 或类似的东西来确保你的服务器也同步。如果你已经这样做了,你应该确保没有其他东西会改变你的服务器时间。
  • 使用 time() 似乎有助于减少无效签名错误的发生次数。非常感谢。但它仍然会偶尔显示错误。会不会是你提到的服务器时间问题?
  • @goose 老实说,我看不出使用time() 有什么好处,因为在几乎所有情况下time() - mktime() == 0。当然你应该使用time(),这不是重点。
【解决方案2】:

如果没有更多信息,我不得不推测它与签名本身有关。

我可以告诉你的是,time()mktime() 是同一个东西,所以它们不是你的根本原因。

我发现,有时签名可能包含 base64 字母表+。如果编码不正确,可能会导致一些问题;在下一次请求时,它可能会消失并且请求会通过。

如果这是自制代码,我建议共享该代码,同时建议您使用更受信任的解决方案,例如 oauth-php 项目或 oauth PECL 扩展。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 2022-07-20
    • 1970-01-01
    • 2013-01-16
    相关资源
    最近更新 更多