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

pho*_*nix 5 php flickr oauth nonce

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

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

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

$nonce   = md5(microtime(true).rand());
$timestamp  = mktime();
Run Code Online (Sandbox Code Playgroud)

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


跟进

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

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

Jan*_*ger 4

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

对于随机数,文档说:

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

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

然而,如果您经常收到此错误,则随机数可能不是您的问题,因为这些冲突不应经常发生。

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