python - 通过将 URL 作为参数传递来进行 CloudStack API 调用时的签名错误
问题描述
我想按照此处所述进行 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 的特殊字符,但我不确定。
有谁知道如何解决这个问题?
解决方案
推荐阅读
- c++ - 有没有办法测试目标是否在 Clang 中具有本机半精度支持?
- google-cloud-platform - 手动触发 GCP 发布子功能
- gtk - 使用 Glade 添加单元格渲染器
- android - 重复的 id,标签为空,带有 androidx.navigation.fragment.NavHostFragment 的另一个片段
- arrays - 如何使用 Blazor 呈现知道其内容类型的字节数组?
- spring-cloud-sleuth - 导入 org.springframework.cloud.sleuth.Sampler 无法解析
- c# - GetAwaiter 不使用系统
- c++ - CUDA:在主机和设备上求和双精度时的精度差异?
- flutter - 如果选中其他复选框,则颤振取消选中复选框
- anylogic - Anylogic 将代理从代理群体分配到流体源批次