Подпись URL-адреса поиска объекта AWS

Я новичок в AWS, я пытаюсь найти элемент по UPC в моем приложении UWP. У меня проблемы с добавлением подписи к URL-адресу запроса. Я продолжаю получать "Подпись запроса, которую мы рассчитали, не соответствует предоставленной вами подписи".

Был ли у кого-нибудь опыт звонков на Amazon? Там документация api в большинстве случаев не нацелена на C #.

    public async void ItemLookup(string itemID)
    {
        Dictionary<string, string> fields = new Dictionary<string, string>();
        fields.Add("AssociateTag", associateTag);
        fields.Add("Condition", "All");
        fields.Add("IdType", "UPC");
        fields.Add("ItemId", itemID);
        fields.Add("Operation", "ItemLookup");
        fields.Add("ResponseGroup", "Large");
        fields.Add("SearchIndex", "All");
        fields.Add("Service", "AWSECommerceService");
        // fields.Add("Timestamp", Uri.EscapeDataString(DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:sssZ")));

        // Build Url for signing
        string url = string.Empty;
        foreach (var pair in fields)
        {
            url += "&" + pair.Key + "=" + pair.Value;
        }


        url = Uri.EscapeUriString(endpoint
                                + "AWSAccessKeyId=" + accessKeyId
                                + url);
        // Add Timestamp
        url += "&Timestamp=" + Uri.EscapeDataString(DateTime.UtcNow.ToString("yyyy-MM-dd'T'HH:mm:ss.fffK", CultureInfo.InvariantCulture));


        // URL        http://webservices.amazon.co.uk/onca/xml?AWSAccessKeyId=REMOVED&AssociateTag=REMOVED&Condition=All&IdType=UPC&ItemId=786936724943&Operation=ItemLookup&ResponseGroup=Large&SearchIndex=All&Service=AWSECommerceService&Timestamp=2017-11-22T11%3A34%3A42.602Z
        // SCRATCHPAD http://webservices.amazon.co.uk/onca/xml?AWSAccessKeyId=REMOVED&AssociateTag=REMOVED&Condition=All&IdType=UPC&ItemId=786936724943&Operation=ItemLookup&ResponseGroup=Large&SearchIndex=All&Service=AWSECommerceService&Timestamp=2017-11-22T09%3A20%3A35.000Z

        // &Signature=Lvqlenpx0wos4Hg6ZzSNHqOc1QwktXgt8nFHBTfTON4%3D



        Byte[] secretBytes = UTF8Encoding.UTF8.GetBytes(secretKey);
        HMACSHA256 hmac = new HMACSHA256(secretBytes);

        Byte[] dataBytes = UTF8Encoding.UTF8.GetBytes(url);
        Byte[] hash = hmac.ComputeHash(dataBytes);
        String signature = Convert.ToBase64String(hash);

        // Full URL
        string requestURL = url + "&Signature=" + signature;

        HttpClient httpClient = new HttpClient();
        HttpResponseMessage responseMessage = await httpClient.GetAsync(requestURL);

        var response = await responseMessage.Content.ReadAsStringAsync();



    }


}

У меня есть URL-адрес из блокнота Amazon, закомментированный против моего собственного URL-адреса, они выровнены, но я не уверен на 100%, правильно ли я работаю над подписью.

Любая помощь будет принята с благодарностью

Кевин


person Kevin Deery    schedule 22.11.2017    source источник


Ответы (2)


Я еще не тестировал следующее. Но есть документ о том, что вы заказываете. Вы проверили следующее, чтобы создать свою подпись?

Во-первых, весь процесс перечислил здесь сказали нам, что вам нужно использовать подписанный URL

Во-вторых, чтобы узнать, как создать подпись URL-адреса с помощью C # и .NET, вы можете обратиться к следующему документу: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/CreateSignatureInCSharp.html.

Кстати, вы можете проверить пример кода первый.

person Barry Wang    schedule 23.11.2017
comment
Образец предназначен для Cloud Front, для подписи требуется политика, IP-адрес и срок действия. Он также использует SHA1, если мне нужно использовать SHA256. Ничего из этого не требуется для API рекламы продукта. Я просмотрел множество документов и образцов и попытался преобразовать образец PHP, созданный в Scratch Pad, в C #. - person Kevin Deery; 23.11.2017

Вы можете использовать следующий пакет nuget.

PM> Install-Package Nager.AmazonProductAdvertising

Пример поиска

var authentication = new AmazonAuthentication();
authentication.AccessKey = "accesskey";
authentication.SecretKey = "secretkey";

var wrapper = new AmazonWrapper(authentication, AmazonEndpoint.UK);
var result = wrapper.Lookup("B00BYPW00I");
person live2    schedule 27.12.2017