Ошибка подписи при выполнении вызова API CloudStack путем передачи URL-адреса в качестве параметра - PullRequest
0 голосов
/ 14 мая 2019

Я хочу сделать вызов CloudStack API 'uploadVolume', как описано в здесь .

Я использую python, и мой код работает для всех остальных вызовов API, за исключением uploadVolume.

secretkey = 'EdKz8Po3zmFWacumfxirauUBPVcLEWKq0qRox1iqhzAsrmLnJaEJxL2IsyDfyPE2Oh5AODJG3ZGKZf6A08xQAw'
apikey = 'YIShhcJ1PaGF5awJlci46qyAqhEN8WYdtUodHAT2wp7-zpN21_fJpcy1POTiMXOlFH-f-rO3zAs3tYRGcFqxwg'

request['command']='uploadVolume'
request['format']='QCOW2'
request['name']='test'
request['url']='http://192.168.122.100/image.qcow2'
request['zoneid']='959416fc-71f0-461c-99f0-28449e098036'
request['response']='json'
request['apikey']= apikey

baseurl='http://192.168.122.250:8080/client/api?'

request_str='&'.join(['='.join([k,urllib.quote_plus(request[k])]) for k in request.keys()])
sig_str='&'.join(['='.join([k.lower(),urllib.quote_plus(request[k].lower().replace('+','%20'))])for k in sorted(request.iterkeys())])
sig=urllib.quote_plus(base64.encodestring(hmac.new(secretkey,sig_str,hashlib.sha1).digest()).strip())

url=baseurl+request_str+'&signature='+sig

Сгенерированный URL выглядит следующим образом:

http://192.168.122.250:8080/client/api?apikey=YIShhcJ1PaGF5awJlci46qyAqhEN8WYdtUodHAT2wp7-zpN21_fJpcy1POTiMXOlFH-f-rO3zAs3tYRGcFqxwg&name=test&format=QCOW2&url=http%3A%2F%2F192.168.122.100%2Fimage.qcow2&zoneid=959416fc-71f0-461c-99f0-28449e098036&command=uploadVolume&response=json&signature=EKhoEWKIG3QcmFM9k6sVRruZvFs%3D

Ответ указывает, что существует проблема с подписью:

{"uploadvolumeresponse":{"uuidList":[],"errorcode":401,"errortext":"unable to verify user credentials and/or request signature"}}

После некоторых тестов я обнаружил, что ошибка подписи возникает из-за параметра url. Если я заменю URL-адрес какой-либо строкой в ​​этом параметре, подпись будет выполнена правильно, но (очевидно) команда не выполнится (поскольку CloudStack не найдет изображение).

Я думаю, что проблема в специальных символах, которые составляют URL, но я не уверен.

Кто-нибудь знает, как решить эту проблему?

...