Tag: 腾讯

  • 使用 PECL 的 OAuth 访问腾讯微薄 API 的一点麻烦

    尝试用 PECL 的 OAuth 访问腾讯微薄,到 Access Token 那步总是有问题。 5% 的成功率。在 Request Token 的时候,也总有不成功的情况发生。

    捕捉到异常:“Invalid auth/bad request (got a 401, expected HTTP/1.1 20X or a redirect)”,服务器返回“Invalid / expired Token”。

    奇怪的是同样的代码,那 5% 的成功率是哪里来的。上 Q 一问,腾讯某大牛提示检查检查 nonce 或者 timestamp 是不是正确。于是乎,检查了一下 OAuth 的代码

    	if (soo->nonce) {
    		nonce = estrdup(soo->nonce);
    	} else {
    		struct timeval tv;
    		int sec, usec;
    		/* XXX maybe find a better way to generate a nonce... */
    		gettimeofday((struct timeval *) &tv, (struct timezone *) NULL);
    		sec = (int) tv.tv_sec;
    		usec = (int) (tv.tv_usec % 0x100000);
    		spprintf(&nonce, 0, "%ld%08x%05x%.8f", php_rand(TSRMLS_C), sec, usec, php_combined_lcg(TSRMLS_C) * 10);
    	}
    

    看到“spprintf(&nonce, 0, “%ld%08x%05x%.8f”, php_rand(TSRMLS_C), sec, usec, php_combined_lcg(TSRMLS_C) * 10);”了吗?!悲剧啊!

    现在明白腾讯文档上那句“随机串(32个字符长度)”是什么意思了,RFC 5849 完全没提 nonce 需要 32 字符长度。腾讯自己说自己复合 OAuth 1.0a 标准,然后在标准上搞出了小标准⋯⋯

    我比较懒,简单搞掂:

    $oauth->setNonce(md5(rand()));