(我找到了答案。下面列出的答案,以防其他人遇到相同的问题。)
对于使用OAuth 1.0的WordPress API调用,Postman创建了完美运行的PHP cURL代码。因此,通过尝试按原样编写代码,我知道他们生成的oauth_signature是正确的。
但是,在我可以找到的关于该主题的每个教程和堆栈溢出问题之后,我无法实现创建一个oauth_signature来与Postman使用相同变量生成的签名相匹配。
通常,随机数和当前时间将是唯一值,但是我当然是从Postman的数据中复制它们,以便在尝试生成签名以匹配Postman提出的签名时拥有所有相同的数据。 / p>
这是我的代码,即使有伪URL和伪令牌,这也正是输入到Postman中的数据。我正在寻找生成签名的步骤的帮助,而不是实际连接到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;
?>
从这些变量中,邮递员给出以下特征的签名: 4TJtCPkjrkBnIthdUujQ4j / RHtY =
但是上面的代码给出了以下特征: plKJeIp4tWC4J2RebyNuelr7vgg =
(我还意识到我的字符串中有一个“&”用于生成签名,但在我的cURL URL中有一个“?”。cURL URL中的“?”是邮递员的方式,它是网站所必需的可以肯定的是,我尝试使用“&”或“?”两种方式生成签名,因为我看到不同的人对生成签名所需的规范要求不同)
答案 0 :(得分:0)
我发现了问题! Twitter文档确实提供了帮助(https://developer.twitter.com/en/docs/basics/authentication/guides/creating-a-signature.html),所以谢谢@RamRaider。
我的$ paramstring组件顺序错误。我从Postman生成的PHP代码中cURL URL中的顺序中获得了该顺序,但是我猜该顺序是一些随机顺序,与生成签名所需的顺序无关,这是字母顺序的。我的代码中的变量应该这样构造:
$paramstring = "oauth_consumer_key=" . $oauthconsumerkey . "&oauth_nonce=" . $nonce . "&oauth_signature_method=HMAC-SHA1" . "&oauth_timestamp=" . $timenow . "&oauth_token=" . $oauthtoken;