flickr oauth api在随机时间返回签名无效错误

时间:2012-09-26 09:42:14

标签: php oauth flickr nonce

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

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

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

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

这有什么问题吗?有没有更好的方法来生成nonce值?这种随机故障非常混乱。我无法想到为什么我会得到一个无效的错误,随机!


跟进

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

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

2 个答案:

答案 0 :(得分:4)

Depending on your PHP version,您应该使用time()代替mktime()

对于nonce,documentation说:

  

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

如果rand()在微秒内返回两次相同的值,则会得到两次相同的nonce。由于MD5冲突,生成MD5哈希也不能保证您获得uniqe值。这里更好的方法是拥有global counter for the nonce

如果你经常遇到这个错误,那么nonce可能不是你的问题,因为这些碰撞不应该经常发生。

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

答案 1 :(得分:1)

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

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

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

如果这是家庭酿造代码,我建议分享该代码,同时建议您使用更值得信赖的解决方案,例如oauth-php项目或oauth PECL扩展。