我正在构建一个查询以将文章POST到Apple News API,我收到了一个WRONG_SIGNATURE响应。
Apple指示您执行以下操作:
创建请求的规范版本,作为以下字节顺序连接:
HTTP方法(例如,全部大写的GET或POST)
请求的完整网址
ISO 8601格式的当前日期
如果请求是POST请求且包含实体,请包含以下内容:
Content-Type标头的值
实体的全部内容
将API密钥的密钥从Base64解码为原始字节。
使用HMAC SHA-256在规范请求中使用已解码的API密钥秘密创建哈希。
使用Base64对哈希进行编码。
将授权标头设置为:
授权:HHMAC;键=;签名=; date = where是步骤1中的日期字符串。
发送请求。
以下是我的代码,它返回了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 ;
答案 0 :(得分:1)
正如文件中所述
以字节方式创建请求的规范版本 连接以下内容:`
- HTTP方法(例如,GET或POST,全部大写)
- 请求的完整网址
- ISO 8601格式的当前日期
但是在你的代码中它是:
$canonical_request = $http_method . $url . $date;
将其更改为
{{1}}
答案 1 :(得分:1)
Tom,你需要在hash_hmac
中更改的一件事是添加true
参数来输出raw。我通过检查发布到Apple News的一些Wordpress插件找到了这个。我在我的代码中进行了此更改,这与您的代码基本相同,但我仍然得到了WRONG_SIGNATURE。
$hash = hash_hmac('sha256', $canonical_request, $secret_key, true);
所以仍然有问题,我也无法发现它。
答案 2 :(得分:0)
我遇到了同样的问题,请尝试删除该行:
$headers[] = 'Content-Type: multipart/form-data';
并检查是否能解决您的问题!
答案 3 :(得分:-1)
您的所有步骤都很好,理想情况下应该有效。只检查是否通过" GET"创建密钥。方法和用法" GET"发布数据时的方法。它适用于我的情况。