欢迎您来到腾讯云!积分商城

腾讯云腾讯云论坛

 找回密码
 立即注册
忘了密码?

扫一扫,访问微社区

快捷导航
搜索
查看: 348|回复: 0
打印 上一主题 下一主题

[经验分享] COS V5签名生成(Python2版)

[复制链接]

13

主题

0

好友

1820

积分

攻城师[LV3]

Rank: 3Rank: 3Rank: 3

云币
7122
威望
1820
跳转到指定楼层
楼主
发表于 2018-6-7 15:14:53 |只看该作者 |倒序浏览 |未分类
应用场景:对象存储V5签名
环境要求:Python 2.7+
具体代码:
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-

  3. import hmac,time,urllib,hashlib,requests
  4. from urllib import quote
  5. from urlparse import urlparse
  6. from requests.auth import AuthBase

  7. def to_string(data):
  8.     """转换unicode为string.

  9.     :param data(unicode|string): 待转换的unicode|string.
  10.     :return(string): 转换后的string.
  11.     """
  12.     if isinstance(data, unicode):
  13.         return data.encode('utf8')
  14.     return data

  15. class CosS3Auth(AuthBase):
  16.     def __init__(self, secret_id, secret_key, key='', params={}, expire=10000):
  17.         self._secret_id = to_string(secret_id)
  18.         self._secret_key = to_string(secret_key)
  19.         self._expire = expire
  20.         self._params = params
  21.         if key:
  22.             if key[0] == '/':
  23.                 self._path = key
  24.             else:
  25.                 self._path = '/' + key
  26.         else:
  27.             self._path = '/'

  28.     def __call__(self, r):
  29.         path = self._path
  30.         uri_params = {}
  31.         headers = {}
  32.         # reserved keywords in headers urlencode are -_.~, notice that / should be encoded and space should not be encoded to plus sign(+)
  33.         headers = dict([(k.lower(), quote(v, '-_.~')) for k, v in headers.items()])  # headers中的key转换为小写,value进行encode
  34.         format_str = "{method}\n{host}\n{params}\n{headers}\n".format(
  35.             method=r.method.lower(),
  36.             host=path,
  37.             params=urllib.urlencode(sorted(uri_params.items())),
  38.             headers='&'.join(map(lambda (x, y): "%s=%s" % (x, y), sorted(headers.items())))
  39.         )

  40.         start_sign_time = int(time.time())
  41.         sign_time = "{bg_time};{ed_time}".format(bg_time=start_sign_time-60, ed_time=start_sign_time+self._expire)
  42.         sha1 = hashlib.sha1()
  43.         sha1.update(format_str)

  44.         str_to_sign = "sha1\n{time}\n{sha1}\n".format(time=sign_time, sha1=sha1.hexdigest())
  45.         sign_key = hmac.new(self._secret_key, sign_time, hashlib.sha1).hexdigest()
  46.         sign = hmac.new(sign_key, str_to_sign, hashlib.sha1).hexdigest()
  47.         sign_tpl = "q-sign-algorithm=sha1&q-ak={ak}&q-sign-time={sign_time}&q-key-time={key_time}&q-header-list={headers}&q-url-param-list={params}&q-signature={sign}"

  48.         r.headers['Authorization'] = sign_tpl.format(
  49.             ak=self._secret_id,
  50.             sign_time=sign_time,
  51.             key_time=sign_time,
  52.             params=';'.join(sorted(map(lambda k: k.lower(), uri_params.keys()))),
  53.             headers=';'.join(sorted(headers.keys())),
  54.             sign=sign
  55.         )
  56.         return r

  57. if __name__ == "__main__":
  58.         secret_id = '你的SecretId'
  59.         secret_key = '你的SecretKey'
  60.         method = 'GET'
  61.         cos_path = '/'

  62.         res = requests.Request(method, cos_path)
  63.         auth = CosS3Auth(secret_id=secret_id, secret_key=secret_key, key=cos_path)
  64.         sign = auth(res).headers['Authorization']
  65.         print sign
复制代码
运行方法:修改secret_id/secret_key以及method和cos_path参数后直接运行即可。
效果图:
sign.png

分享到: 微信微信
收藏收藏0 支持支持0 反对反对0 有 2 人觉得本主题有帮助
您需要登录后才可以回帖 登录 | 立即注册
您需要登录后才可以发帖 QQ登录

联系我们|腾讯云平台|积分商城|腾讯云官方论坛    

GMT+8, 2018-9-19 19:55 , Processed in 1.168002 second(s), 31 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部