5

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

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

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

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

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


跟进

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

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

4

2 回答 2

4

根据您的 PHP 版本,您应该使用time()而不是mktime().

对于随机数,文档说:

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

如果rand()在一微秒内两次返回相同的值,您将获得两次相同的随机数。由于 MD5 冲突,生成 MD5 哈希也不能保证您获得唯一值。这里更好的方法是为 nonce 设置一个全局计数器

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

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

于 2012-09-30T11:36:20.403 回答
1

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

我可以告诉你的是,time()mktime()是一回事,所以它们不是你的根本原因。

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

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

于 2012-10-05T02:35:36.937 回答