摘要:OBS提供了REST(Representational State Transfer)格调API,反对您通过HTTP/HTTPS申请调用。本文将带你理解OBS API鉴权实现的宝典秘籍。OBS提供了REST(Representational State Transfer)格调API,反对您通过HTTP/HTTPS申请调用。在调用OBS的API前,须要理解OBS的鉴权认证形式。
签名计算篇本文就将带您理解OBS的两种常见的鉴权形式——Header携带签名和URL携带签名。
1、在Header中携带签名计算官网链接:https://support.huaweicloud.c...
1.1、签名的计算原理和计算方法
原理图示
计算方法
1.结构申请字符串(StringToSign)。
申请字符串的构造方法如下:
StringToSign =
HTTP-Verb + "n" +
Content-MD5 + "n" +
Content-Type + "n" +
Date + "n" +
CanonicalizedHeaders + CanonicalizedResource
2.对第一步的后果进行UTF-8编码。
3.应用SK对第二步的后果进行HMAC-SHA1签名计算。
4.对第三步的后果进行Base64编码,失去签名。
签名如以下模式(28位长度的BASE64编码的字符串):
JONydLd9zpf+Eu3IYiUjNmukHN0= 计算示例
例:须要获取桶”obs-test”下的对象log.conf的对象ACL,如何结构申请并计算签名?
1、首先明确StringToSign的各字段:
申请办法:GET;
申请MD5:空
Content-Type:空
申请工夫:Tue, 28 Jul 2020 06:29:47 GMT(即北京工夫2020年7月28日14:29:47)
自定义头域(CanonicalizedHeaders):空
规范化资源(CanonicalizedResource):/obs-test/log.conf?acl
2、结构申请字符串StringToSign如下:
StringToSign = ‘’’GET
Tue, 28 Jul 2020 06:29:47 GMT
/obs-test/log.conf?acl’’’
3、依据签名算法,将StringToSign进行HMAC-SHA1计算后进行BASE64编码取得签名后果:xYlcrwT9jSaCtY0OnBE01OBR+aA=
1.2、签名计算的实现形式
以Python计算签名代码为例,供参考:
1. import hashlib 2. import hmac 3. import binascii 4. from datetime import datetime 5. 6. # 验证信息 7. AK = '您的access_key_id' 8. SK = '您的secret_access_key_id' 9. 10. # 指定HTTP办法,可选GET/PUT/DELETE/POST/OPTIONS 11. httpMethod = "GET" 12. 13. # 指定申请的Header:Content-Type和Content-MD5 14. contentType = "" 15. conten**5 = "" 16. 17. # 应用datetime库生成工夫,如果须要自定义申请工夫请放弃格局统一 18. date = datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT') 19. 20. # 填写canonicalizedHeaders 21. # canonicalizedHeaders = "x-obs-acl:public-read" 22. # canonicalizedHeaders = "x-obs-acl:public-readn"+'x-obs-storage-class:WARMn' 23. canonicalizedHeaders = "" 24. 25. # 填写CanonicalizedResource 26. # CanonicalizedResource = "/BucketName/ObjectName" 27. # CanonicalizedResource = "/BucketName/ObjectName?acl" 28. # CanonicalizedResource = "/"29. CanonicalizedResource = "/BucketName/" 30. 31. # 生成StringToSign 32. canonical_string = httpMethod + "n" + conten**5 + "n" + contentType + "n" + date + "n" + canonicalizedHeaders + CanonicalizedResource 33. 34. # 计算签名并进行BASE64编码 35. hashed = hmac.new(SK.encode('UTF-8'), canonical_string.encode('UTF-8'), hashlib.sha1) 36. encode_canonical = binascii.b2a_base64(hashed.digest())[:-1].decode('UTF-8') 37. 38. # 打印StringToSign以便呈现问题时进行验证 39. print(canonical_string) 40. 41. # 打印签名 42. print(encode_canonical) C语言签名算法示例:
...