хэш — Apple News API переполнение стека

Я создаю запрос к статьям POST в API Apple News и получаю ответ 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 ;

1

Решение

Том, одну вещь, которую нужно изменить в hash_hmac это добавить true параметр для вывода в сыром виде. Я нашел это, изучив некоторые плагины WordPress, которые публикуются в Apple News. Я сделал это изменение в своем коде, который по сути совпадает с вашим, но я все еще получаю WRONG_SIGNATURE.
$hash = hash_hmac('sha256', $canonical_request, $secret_key, true);
Так что все еще что-то не так, я тоже не могу это заметить.

1

Другие решения

Как сказано в документации

Создайте каноническую версию запроса как побайтовую
конкатенация следующего: `

  • Метод HTTP (например, GET или POST, во всех заглавных буквах)
  • Полный URL запроса
  • Текущая дата в формате ISO 8601

Но в вашем коде это:

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

Измените это на

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

У меня возникла та же проблема, попробуйте удалить строку:

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

и проверьте, решает ли это вашу проблему!

0

Все ваши шаги в порядке и в идеале должны работать. Только проверьте, создаете ли вы секретный ключ методом «GET» и используете метод «GET» при публикации данных. Это работает в моем случае.

-1