Apple News API PHP

时间:2016-04-27 11:33:14

标签: php hash cryptography apple-news

我正在构建一个查询以将文章POST到Apple News API,我收到了一个WRONG_SIGNATURE响应。

Apple指示您执行以下操作:

  1. 创建请求的规范版本,作为以下字节顺序连接:

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

    请求的完整网址

    ISO 8601格式的当前日期

  2. 如果请求是POST请求且包含实体,请包含以下内容:

    Content-Type标头的值

    实体的全部内容

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

    2. 使用HMAC SHA-256在规范请求中使用已解码的API密钥秘密创建哈希。

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

    4. 将授权标头设置为:

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

    5. 发送请求。

    6. 以下是我的代码,它返回了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 个答案:

答案 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"发布数据时的方法。它适用于我的情况。