Posting articles to apple news api

Обновить

December 2018

Просмотры

394 раз

5

Я пытаюсь опубликовать статьи в пресс-яблочный апи. Apple, инструктирует сделать следующее:

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

Метод HTTP (например, GET или POST, во всех колпачков)

Полный URL запроса

Текущая дата в формате ISO 8601 Если запрос является запросом POST, и включает в себя объект, включают в себя следующее:

Значение заголовка Content-Type

Полное содержание объекта

Decode тайны ключа API от Base64 к сырьевым байтам. Создание хэша с помощью HMAC SHA-256 по каноническому запросу с ключом секретом декодированного API. Кодировать хэш с Base64. Установить заголовок Authorization как:

Авторизация: HHMAC; ключ =; подпись =; дата = где является строка даты, начиная с шага 1. Отправить запрос.

Ниже мой C # код

string path = "https://news-api.apple.com/channels/channelid/articles";

var httpWebRequest = (HttpWebRequest)WebRequest.Create(path);
httpWebRequest.ContentType = "multipart/form-data";
httpWebRequest.Method = "POST";
httpWebRequest.Accept = "application / json";
httpWebRequest.Host = "news-api.apple.com";
httpWebRequest.UseDefaultCredentials = true;
httpWebRequest.PreAuthenticate = true;

httpWebRequest.ProtocolVersion = HttpVersion.Version11;
httpWebRequest.KeepAlive = true;
string appleDate= String.Format("{0}Z", DateTime.UtcNow.ToString("s"));
string credentials = String.Format("{0}:{1}", "Content-Disposition", "form-data; ");
credentials += String.Format("{0}:{1}", "filename", "article.json; ");
credentials += String.Format("{0}:{1}", "name", "article.json; ");

credentials += String.Format("{0}:{1}", "Authorization", "HHMAC; ");
credentials += String.Format("{0}:{1}", "key", "api key; ");

string decodedSecret = base64Decode("secret_key");
string canonical_request = "POST" + path + appleDate;
string hash = Class1.HmacSha256Digest(canonical_request, decodedSecret);
string Encodedhash = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(hash));

credentials += String.Format("{0}:{1}", "signature", Encodedhash + "; ");
credentials += String.Format("{0}:{1}", "date", appleDate + "; ");    

httpWebRequest.Headers.Add("Authorization", "Basic " +credentials);

httpWebRequest.Credentials = new NetworkCredential("xxx.com", "xxxx");

using (StreamReader r = new StreamReader(HttpContext.Current.Server.MapPath("~/article.json")))
{
    string json = r.ReadToEnd();
    dynamic jsonObj = JsonConvert.DeserializeObject(json);

    ASCIIEncoding encoding = new ASCIIEncoding();
    Byte[] bytes = encoding.GetBytes(json);
    Stream newStream = httpWebRequest.GetRequestStream();
    newStream.Write(bytes, 0, bytes.Length);
    newStream.Close();
}

var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();

using (var streamReader = newStreamReader(httpResponse.GetResponseStream()))
{
    var result = streamReader.ReadToEnd();
}

метод Decode

public static string base64Decode(string data)
{
    var base64EncodedBytes = System.Convert.FromBase64String(data);
    return System.Text.Encoding.UTF8.GetString(base64EncodedBytes);
}

Метод расширения является HmacSha256

public static class Class1
{
    public static string HmacSha256Digest(this string message, string secret)
    {
        ASCIIEncoding encoding = new ASCIIEncoding();
        byte[] keyBytes = encoding.GetBytes(secret);
        byte[] messageBytes = encoding.GetBytes(message);
        System.Security.Cryptography.HMACSHA256 cryptographer = new System.Security.Cryptography.HMACSHA256(keyBytes);

        byte[] bytes = cryptographer.ComputeHash(messageBytes);

        return BitConverter.ToString(bytes).Replace("-", "").ToLower();
    }
}

получил Несанкционированное ошибка (Wrong подпись).

0 ответы