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

Php flickr oauth api在随机时间返回签名无效错误,php,oauth,flickr,nonce,Php,Oauth,Flickr,Nonce,我有一个web应用程序,可以对用户的flickr api进行身份验证。它使用OAuth 1.0,大部分时间都可以进行身份验证。但在随机的时间,在完全随机的时间,flickr不认识我的签名。它在请求请求令牌时返回无效签名错误。但在下一次尝试中,相同的代码将正确地带回请求令牌 我怀疑这与我生成nonce或time stamp的方式有关。否则它在连续的尝试中不应该起作用,对吗 这就是生成nonce和时间戳值的方法: $nonce = md5(microtime(true).rand()); $ti

我有一个web应用程序,可以对用户的flickr api进行身份验证。它使用OAuth 1.0,大部分时间都可以进行身份验证。但在随机的时间,在完全随机的时间,flickr不认识我的签名。它在请求请求令牌时返回无效签名错误。但在下一次尝试中,相同的代码将正确地带回请求令牌

我怀疑这与我生成nonce或time stamp的方式有关。否则它在连续的尝试中不应该起作用,对吗

这就是生成nonce和时间戳值的方法:

$nonce   = md5(microtime(true).rand());
$timestamp  = mktime();
这有什么问题吗?有没有更好的方法来生成nonce值?这种随机故障非常令人困惑。我想不出任何其他的原因,为什么我会得到一个无效的错误,随机


跟进

根据Jan Gerlinger的建议,我将mktime()更改为time()。这无疑降低了事故发生的频率。但它仍然会在随机时间出现无效的签名错误,我可能会补充说,在更改为time()之后,这种情况很少发生

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

,您应该使用而不是
mktime()

目前,报告说:

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

如果你在一微秒内两次返回相同的值,你会得到两次相同的nonce。由于MD5冲突,生成MD5哈希也不能保证获得uniqe值。这里更好的方法是有一个

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


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

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

我能告诉你的是
time()
mktime()
是同一件事,所以它们不是你的根本原因

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


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

非常感谢Jan的帮助。让我试试。我会带着结果回来的。大约那个时候同步;有没有办法确保我的服务器时间与flickr服务器时间同步?flickr的服务器当然是使用一些NTP服务器同步的,所以最好使用
ntpdate
或类似的方法来确保服务器也同步。如果您已经这样做了,您应该确保没有任何其他因素会改变您的服务器时间。使用time()似乎有助于减少出现无效签名错误的次数。谢谢。但它仍然偶尔会显示错误。这可能是您提到的服务器时间问题吗?@goose老实说,我不认为使用
time()
更好,因为在几乎所有情况下
time()-mktime()==0
。当然,你应该使用
time()
,这不是重点。我建议记录所有请求以及它们是否成功;然后试着从中找出一个模式。@Jack我试着从中找出一个模式。但正如我所说,它发生在完全随机的时间;如果您说在第二次尝试时,相同的确切时间和时间起作用,则可能是其他原因,例如临时服务器错误。