1

我正在构建一个查询以将文章发布到 Apple News API,并且收到 WRONG_SIGNATURE 响应。

Apple 指示您执行以下操作:

  1. 将请求的规范版本创建为以下内容的逐字节串联:

    HTTP 方法(例如,GET 或 POST,全部大写)

    请求的完整 URL

    ISO 8601 格式的当前日期

如果请求是 POST 请求并且它包含一个实体,请包含以下内容:

Content-Type 标头的值

实体的全部内容

  1. 将 API 密钥的秘密从 Base64 解码为原始字节。

  2. 使用 HMAC SHA-256 在规范请求上使用解码的 API 密钥创建散列。

  3. 使用 Base64 对哈希进行编码。

  4. 将授权标头设置为:

    授权:HHMAC;键=; 签名=; date= 其中是步骤 1 中的日期字符串。

  5. 发送请求。

这是我返回 WRONG_SIGNATURE 结果的代码(API 凭据已更改)

//set the timezone
date_default_timezone_set('UTC');

//get json to be sent
$data = file_get_contents('http://www.broadwayworld.com/articleapple.cfm?colid=195', true);

//set variables
$http_method = 'POST';
$date = gmdate('Y-m-d\TH:i:s\Z');
$key = '62a75411-dd-4c3b-9d9-c7053760';
$url = 'https://news-api.apple.com/channels/485ae91a-2212-4276-9d07-82da7/articles';
$secret = base64_decode('9w9sElVs4UVGxMkGxCWOOWHJknKiNWa6tA=');

//cannonical request
$canonical_request = $url . $http_method  . $date;

//Signature
$api_signature = base64_encode(hash_hmac('sha256', $canonical_request, $secret));

//curl options
$ch = curl_init();
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);
$headers = array();
$headers[] = "Authorization: HHMAC; key={$key}; signature={$api_signature}; date={$date}";
$headers[] = 'Content-Type: multipart/form-data';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

//get result
$server_output = curl_exec ($ch);
curl_close ($ch);
print  $server_output ;
4

4 回答 4

1

正如它在文档中所说

创建请求的规范版本,作为以下内容的字节连接:`

  • HTTP 方法(例如,GET 或 POST,全部大写)
  • 请求的完整 URL
  • ISO 8601 格式的当前日期

但在你的代码中是:

$canonical_request = $url . $http_method  . $date;

将其更改为

$canonical_request = $http_method . $url  . $date;
于 2016-04-27T11:55:35.183 回答
1

汤姆,您需要更改的一件事hash_hmac是将true参数添加到原始输出。我通过检查一些发布到 Apple News 的 Wordpress 插件发现了这一点。我在我的代码中进行了此更改,这与您的基本相同,但我仍然得到 WRONG_SIGNATURE 。 $hash = hash_hmac('sha256', $canonical_request, $secret_key, true); 所以还是有问题,我也看不出来。

于 2016-04-27T23:05:23.130 回答
0

我遇到了同样的问题,请尝试删除该行:

$headers[] = 'Content-Type: multipart/form-data'; 

并检查是否可以解决您的问题!

于 2017-08-01T20:53:57.953 回答
-1

您的所有步骤都很好,理想情况下应该可以工作。仅检查您是否通过“GET”方法创建密钥并在发布数据时使用“GET”方法。它适用于我的情况。

于 2017-03-21T09:00:55.723 回答