Ошибка жалуется, что что-то не так в том, как мы вычисляем подпись.Давайте посмотрим на пример кода Apple для получения правильной подписи, которая находится здесь:
https://developer.apple.com/documentation/apple_news/apple_news_api/about_the_news_security_model
К сожалению, я нашел только код Python.Я тоже не знаю Python, но я могу понять достаточно, чтобы адаптировать его, чтобы просто показать подпись.Нам также необходимо точно знать, какое значение даты использовалось.
import base64
from hashlib import sha256
import hmac
from datetime import datetime
channel_id = 'cdb737aa-FFFF-FFFF-FFFF-FFFFFFFFFFFF'
api_key_id = '240ab880-FFFF-FFFF-FFFF-FFFFFFFFFFFF'
api_key_secret = 'HgyfMPjFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF='
url = 'https://news-api.apple.com/channels/%s' % channel_id
date = str(datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ"))
canonical_request = 'GET' + url + date
key = base64.b64decode(api_key_secret)
hashed = hmac.new(key, canonical_request, sha256)
signature = hashed.digest().encode("base64").rstrip('\n')
print date
print signature
Результат можно увидеть здесь (короткая ссылка указывает на tutorialspoint.com, который был первым онлайн-интерпретатором Python, который я нашел в Google):
http://tpcg.io/e1W4p1
Если вы не доверяете ссылке, просто знайте, что я смог использовать ее, чтобы выяснить следующую известную правильную подпись на основена этих известных входах:
Метод: GET
URL: https://news-api.apple.com/channels/cdb737aa-FFFF-FFFF-FFFF-FFFFFFFFFFFF
DateTime: 2018-06-12T18:15:45Z
API Secret: HgyfMPjFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF=
Подпись: f3cOzwH7HGYPg481noBFwKgVOGAhH3jy7LQ75jVignA=
Теперь мы можем написать C # код, который мы можем проверить.Когда мы сможем использовать те же входные данные для получения одинакового результата подписи, у нас будет правильный код.
Исходя из этого, я смог написать этот код C #:
public static void Main()
{
string method = "GET";
string url = "https://news-api.apple.com/channels/cdb737aa-FFFF-FFFF-FFFF-FFFFFFFFFFFF";
string dateString = "2018-06-12T18:15:45Z";
string apiKeySecret = "HgyfMPjFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF=";
var MyResult = GetSignature(method, url, dateString, apiKeySecret);
var DocumentedResult = "f3cOzwH7HGYPg481noBFwKgVOGAhH3jy7LQ75jVignA=";
Console.WriteLine(MyResult);
Console.WriteLine(MyResult == DocumentedResult);
}
public static string GetSignature(string method, string url, string dt, string APISecret)
{
var hmac = new HMACSHA256(Convert.FromBase64String(APISecret));
var hashed = hmac.ComputeHash(Encoding.ASCII.GetBytes(method + url + dt));
return Convert.ToBase64String(hashed);
}
Какой выможно увидеть в действии здесь:
https://dotnetfiddle.net/PQ73Zv
У меня нет своего собственного ключа Apple API для тестирования, так что это насколько я могу вам помочь,
Одна вещь, на которую я обратил внимание в этом вопросе, это то, что в примере Apple есть «Z
» в конце строки даты, которая здесь отсутствует с исходным кодом.