Ошибка подписи запроса для вызова API Alibaba Cloud

Я попытался создать метод в Postman и подошел очень близко, но у меня проблемы с подписью. Мы пытаемся запросить диапазоны IP-адресов для VPC, чтобы добавить их в правило WAF, чтобы разрешить трафик в безопасное приложение.

Postman допускает сценарий предварительного запроса на Javascript и поддерживает несколько включенных библиотек JS, включая CryptoJS.

Код здесь создает именно тот запрос, который, по словам Али Клауда, необходимо подписать. Он подписывается с помощью HMAC-SHA1 от CryptoJS и кодируется до base 64.

Все переменные включены в параметры запроса. Я не уверен, на что еще он мог жаловаться.

var dateIso = new Date().toISOString();

var randomString = function(length) {
    var text = "";
    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    for(var i = 0; i < length; i++) {
        text += possible.charAt(Math.floor(Math.random() * possible.length));
    }
    return text;
}

var accesskeyid = "LTAI4GC7VEijsm5bV3zwcZxZ"
var action = "DescribePublicIPAddress"
var format = "XML"
var regionid = "cn-shanghai-eu13-a01"
var signaturemethod = "HMAC-SHA1"
var signaturenonce = randomString(16)
var signatureversion = "1.0"
var timestamp = dateIso.replace(/:/gi, "%253A")
var version = "2016-04-28"

pm.environment.set("AccessKeyId", accesskeyid)
pm.environment.set("Action", action)
pm.environment.set("Format", format)
pm.environment.set("RegionID", regionid)
pm.environment.set("SignatureMethod", signaturemethod)
pm.environment.set("SignatureNonce", signaturenonce)
pm.environment.set("SignatureVersion", signatureversion)
pm.environment.set("Timestamp", dateIso)
pm.environment.set("Version", version)

var request = "GET&amp;%2F&amp;" + "AccessKeyID%3D" + accesskeyid + "%26Action%3D" + action + "%26Format%3D" + format + "%26RegionID%3D" + regionid + "%26SignatureMethod%3D" + signaturemethod + "%26SignatureNonce%3D" + signaturenonce + "%26SignatureVersion%3D" + signatureversion + "%26Timestamp%3D" + timestamp + "%26Version%3D" + version

pm.environment.set("Request", request)

var hash = CryptoJS.HmacSHA1(request, "spwH5dNeEm4t4dlpqvYWVGgf7aEAxB&")
var base64 = CryptoJS.enc.Base64.stringify(hash)
var encodesig = encodeURIComponent(base64)
pm.environment.set("Signature", encodesig);

console.log(base64)
console.log(request)

Вывод консоли показывает:

Signature: XbVi12iApzZ0rRgJLBv0ytJJ0LY=

Parameter string to be signed: 
GET&amp;%2F&amp;AccessKeyID%3DLTAI4GC7VEijsm5bV3zwcZvC%26Action%3DDescribePublicIPAddress%26Format%3DXML%26RegionID%3Dcn-shanghai-eu13-a01%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3DiP1QJtbasQNSOxVY%26SignatureVersion%3D1.0%26Timestamp%3D2020-06-01T15%253A38%253A12.266Z%26Version%3D2016-04-28

Request sent:
GET https://vpc.aliyuncs.com/?AccessKeyID=LTAI4GC7VEijsm5bV3zwcZvC&Action=DescribePublicIPAddress&Format=XML&RegionID=cn-shanghai-eu13-a01&SignatureMethod=HMAC-SHA1&SignatureNonce=iP1QJtbasQNSOxVY&SignatureVersion=1.0&Timestamp=2020-06-01T15:38:12.266Z&Version=2016-04-28&Signature=XbVi12iApzZ0rRgJLBv0ytJJ0LY%3D

Response Received:
<?xml version='1.0' encoding='UTF-8'?><Error><RequestId>B16D216F-56ED-4D16-9CEC-633C303F2B61</RequestId><HostId>vpc.aliyuncs.com</HostId><Code>IncompleteSignature</Code><Message>The request signature does not conform to Aliyun standards. server string to sign is:GET&amp;%2F&amp;AccessKeyID%3DLTAI4GC7VEijsm5bV3zwcZvC%26Action%3DDescribePublicIPAddress%26Format%3DXML%26RegionID%3Dcn-shanghai-eu13-a01%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3DiP1QJtbasQNSOxVY%26SignatureVersion%3D1.0%26Timestamp%3D2020-06-01T15%253A38%253A12.266Z%26Version%3D2016-04-28</Message><Recommend><![CDATA[https://error-center.aliyun.com/status/search?Keyword=IncompleteSignature&source=PopGw]]></Recommend></Error>

Когда я проверяю «строку сервера для подписи» в ответе и строку параметра, подписанную при сравнении, они идентичны.

Вроде все построено как надо, но подпись все равно лает. Догадываюсь, что упустила что-то простое, но пока не нашла.

Примечание. Опубликованные accesskeyID и ключ предназначены для примера, а не для реальной учетной записи, поэтому этот код не будет копироваться и вставляться для выполнения в Postman.

PS - Я многому научился из нескольких других веток по этой теме, и вот как я дошел до этого момента. Акостадинов был очень полезен в другой ветке.


person Benji Kauth    schedule 01.06.2020    source источник


Ответы (2)


Я считаю, что у вас есть двойная кодировка &. Я успешно реализовал другие API REST Alibaba Cloud. Не могли бы вы это проверить.

Ниже приводится ожидаемая строка для подписи формата:

GET&%2F&AccessKeyId%3Dtestid&Action%3DDescribeVpcs&Format%3DXML&
SignatureMethod%3DHMAC-SHA1&SignatureNonce%3D3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf&SignatureVersion%3D1.0&TimeStamp%3D2016-02-23T12%253A46%
253A24Z&Version%3D2014-05-15
person Shashank Kumar    schedule 01.08.2020

Немного поздно для вечеринки, но поскольку это первый результат поиска в Google ошибки IncompleteSignature, я подумал, что могу прокомментировать и, надеюсь, спасти кого-то еще от горя, через которое я прошел.

Для меня тонкая деталь, которую я упустил в официальной документации здесь заключается в том, что ключ, используемый для подписи, требует добавления амперсанда & в конец перед использованием.

Как только я это уловил, все остальное заработало отлично.

person Buffoonism    schedule 10.07.2021