(我已经找到答案了。下面将其作为答案列出,以防其他任何人遇到同样的问题。)
对于使用PHP1.0的PHP调用,OAuth会创建完美工作的WordPress cURL代码。因此,通过尝试他们的原样代码,我知道他们生成的oauth_signature是正确的。
但是根据我能找到的关于这个主题的每个教程和堆栈溢出问题,我无法让我的实现创建一个与Postman使用相同变量生成的oauth_signature相匹配的and。
通常,nonce和当前时间是唯一的值,但我当然是从Postman的数据中复制它们,以便在尝试生成签名以匹配Postman提出的签名时拥有所有相同的数据。
这是我的代码,这就是输入到Postman中的数据,即使有一个虚拟URL和虚拟令牌。我正在寻找关于生成签名的步骤的帮助,而不是实际连接到API (这部分工作得很好)。
我相信我的生成签名的方法有问题,因为其他所有东西都匹配,我唯一不需要检查的信息是Postman的源代码,以了解Postman是如何使用您给出的数据生成签名的,所以我正在寻找这个实现的帮助。
是的,我知道有一些库(我已经查看了其中的一些,以便将我的代码实现与他们的代码进行比较),但我正在尝试在没有库的情况下做到这一点,因为这真的不应该那么难。
<?php
$oauthconsumerkey = "oconsumerkey";
$oauthtoken = "otoken";
$clientsecret = "oclientsecret";
$tokensecret = "otokensecret";
$key = rawurlencode($clientsecret) . "&" . rawurlencode($tokensecret);
$method = "GET";
$baseurl = "https://test.com/wp-json/wp/v2/users/me/";
// these 2 variables were generated by Postman
$nonce = "1TT5UggZswB";
$timenow = "1548458598";
$paramstring = "oauth_consumer_key=" . $oauthconsumerkey . "&oauth_token=" . $oauthtoken . "&oauth_signature_method=HMAC-SHA1" . "&oauth_timestamp=" . $timenow . "&oauth_nonce=" . $nonce;
$encodeurl = $method . "&" . rawurlencode($baseurl) . "&" . rawurlencode($paramstring);
$signature = hash_hmac( 'sha1', $encodeurl, $key, TRUE );
$signature = base64_encode( $signature );
$curlurl = $baseurl . "?" . $paramstring . "&oauth_signature=" . $signature;
print $signature;
?>
从这些变量中,Postman给出一个签名: 4TJtCPkjrkBnIthdUujQ4j/RHtY=
但是上面的代码给出了一个签名: plKJeIp4tWC4J2RebyNuelr7vgg=
(我还意识到我的字符串中有一个用于生成签名的"&“,而"?”在我的cURL网址中。"?“在Postman URL中是cURL的方式,它是站点识别路由所必需的。(为了确认,我已经尝试了两种方式生成签名,使用"&“或"?",因为我看到不同的人对生成签名所需的规范有不同的看法。)
发布于 2019-01-26 07:51:56
我发现了问题所在!推特上的文档确实帮助了我们(https://developer.twitter.com/en/docs/basics/authentication/guides/creating-a-signature.html),所以谢谢@RamRaider。
我的$paramstring组件顺序错误。我从Postman生成的cURL代码中的PHP中获取它们的顺序,但我猜这个顺序是随机的,与生成签名所需的顺序无关,后者是按字母顺序排列的。我的代码中的那个变量应该是这样构造的:
$paramstring = "oauth_consumer_key=" . $oauthconsumerkey . "&oauth_nonce=" . $nonce . "&oauth_signature_method=HMAC-SHA1" . "&oauth_timestamp=" . $timenow . "&oauth_token=" . $oauthtoken;https://stackoverflow.com/questions/54373814
复制相似问题