如何生成HMAC-SHA1签名以与WP REST API和OAuth1一起使用

时间:2016-07-19 作者:wiseone

我正在尝试使用WP REST API发布帖子。我能够使用OAuth1和PAW http客户端进行身份验证。我还可以在网站上发布帖子(再次使用PAW)。

PAW生成了PHP代码供我在网站上使用。我创建了测试。php并在那里插入代码。已尝试在浏览器中打开页面。它没有得到验证。它说,(第一次)签名无效,另一次,时间戳无效,另一次,nonce无效。

我检查了PAW,发现在每次新运行时,PAW都会生成一个唯一的nonce、时间戳和HMAC-SHA1签名,但我编写的代码在每次运行时都具有相同的nonce、时间戳和HMAC-SHA1签名。我想我需要找到一种方法来自动生成唯一的nonce、时间戳和签名。

有人能帮我吗?

代码如下:

<?php

// Get cURL resource
$ch = curl_init();

// Set url
curl_setopt($ch, CURLOPT_URL, \'http://sitename.com/wp-json/wp/v2/posts\');

// Set method
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, \'POST\');

// Set options
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// Set headers
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  "Authorization: OAuth oauth_consumer_key=\\"zfksKSt8m7Bk\\", oauth_nonce=\\"dWXo8bGuKTMEqbmLf8cwqcWjfjDyqwKh\\", oauth_signature=\\"%2BOy0fDsKilNymYOOZRqjJN5q3tg%3D\\", oauth_signature_method=\\"HMAC-SHA1\\", oauth_timestamp=\\"1468900106\\", oauth_token=\\"IG6x6jIjboVhmyzFtjzn1fGT\\", oauth_version=\\"1.0\\"",
  "Content-Type: application/json; charset=utf-8",
 ]
);
// Create body
$json_array = [
            "title" => "This is going to be a newww posttt"
        ];
$body = json_encode($json_array);

// Set body
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);

// Send the request & save response to $resp
$resp = curl_exec($ch);

if(!$resp) {
  die(\'Error: "\' . curl_error($ch) . \'" - Code: \' . curl_errno($ch));
} else {
  echo "Response HTTP Status Code : " . curl_getinfo($ch, CURLINFO_HTTP_CODE);
  echo "\\nResponse HTTP Body : " . $resp;
}

// Close request to clear up some resources
curl_close($ch);

1 个回复
SO网友:Leon

我也有同样的问题,但对于自动生成时间和nonce,您可以执行以下操作:

<?php
$nonce = md5(mt_rand());
// Set headers
curl_setopt($ch, CURLOPT_HTTPHEADER, [\'
    Authorization: OAuth oauth_consumer_key="zfksKSt8m7Bk",
    oauth_nonce=\'.$nonce.\',
    oauth_signature="%2BOy0fDsKilNymYOOZRqjJN5q3tg%3D",
    oauth_signature_method="HMAC-SHA1",
    oauth_timestamp=\'.time().\',
    oauth_token="IG6x6jIjboVhmyzFtjzn1fGT",
    oauth_version="1.0"
    \',
    \'Content-Type: application/json; charset=utf-8\',
]
);
我正在学习生成签名。我认为使用以下内容生成签名会很有用

$signature = hash_hmac( \'sha1\', $base_string, $key );