10
10
from .utils import urlsafe_base64_encode
11
11
12
12
13
+ # 上传策略,参数规格详见
14
+ # http://developer.qiniu.com/docs/v6/api/reference/security/put-policy.html
13
15
_policy_fields = set ([
14
- 'callbackUrl' ,
15
- 'callbackBody' ,
16
- 'callbackHost' ,
17
- 'callbackBodyType' ,
18
- 'callbackFetchKey' ,
19
-
20
- 'returnUrl' ,
21
- 'returnBody' ,
22
-
23
- 'endUser' ,
24
- 'saveKey' ,
25
- 'insertOnly' ,
26
-
27
- 'detectMime' ,
28
- 'mimeLimit' ,
29
- 'fsizeLimit' ,
30
-
31
- 'persistentOps' ,
32
- 'persistentNotifyUrl' ,
33
- 'persistentPipeline' ,
16
+ 'callbackUrl' , # 回调URL
17
+ 'callbackBody' , # 回调Body
18
+ 'callbackHost' , # 回调URL指定的Host
19
+ 'callbackBodyType' , # 回调Body的Content-Type
20
+ 'callbackFetchKey' , # 回调FetchKey模式开关
21
+
22
+ 'returnUrl' , # 上传端的303跳转URL
23
+ 'returnBody' , # 上传端简单反馈获取的Body
24
+
25
+ 'endUser' , # 回调时上传端标识
26
+ 'saveKey' , # 自定义资源名
27
+ 'insertOnly' , # 插入模式开关
28
+
29
+ 'detectMime' , # MimeType侦测开关
30
+ 'mimeLimit' , # MimeType限制
31
+ 'fsizeLimit' , # 上传文件大小限制
32
+
33
+ 'persistentOps' , # 持久化处理操作
34
+ 'persistentNotifyUrl' , # 持久化处理结果通知URL
35
+ 'persistentPipeline' , # 持久化处理独享队列
34
36
])
35
37
36
38
_deprecated_policy_fields = set ([
39
41
40
42
41
43
class Auth (object ):
44
+ """七牛安全机制类
45
+
46
+ 该类主要内容是七牛上传凭证、下载凭证、管理凭证三种凭证的签名接口的实现,以及回调验证。
47
+
48
+ Attributes:
49
+ __access_key: 账号密钥对中的accessKey,详见 https://portal.qiniu.com/setting/key
50
+ __secret_key: 账号密钥对重的secretKey,详见 https://portal.qiniu.com/setting/key
51
+ """
42
52
43
53
def __init__ (self , access_key , secret_key ):
54
+ """初始化Auth类"""
44
55
self .__checkKey (access_key , secret_key )
45
56
self .__access_key , self .__secret_key = access_key , secret_key
46
57
self .__secret_key = b (self .__secret_key )
@@ -58,6 +69,16 @@ def token_with_data(self, data):
58
69
return '{0}:{1}:{2}' .format (self .__access_key , self .__token (data ), data )
59
70
60
71
def token_of_request (self , url , body = None , content_type = None ):
72
+ """带请求体的签名(本质上是管理凭证的签名)
73
+
74
+ Args:
75
+ url: 待签名请求的url
76
+ body: 待签名请求的body
77
+ content_type: 待签名请求的body的Content-Type
78
+
79
+ Returns:
80
+ 管理凭证
81
+ """
61
82
parsed_url = urlparse (url )
62
83
query = parsed_url .query
63
84
path = parsed_url .path
@@ -82,10 +103,15 @@ def __checkKey(access_key, secret_key):
82
103
raise ValueError ('invalid key' )
83
104
84
105
def private_download_url (self , url , expires = 3600 ):
85
- '''
86
- * return private url
87
- '''
106
+ """生成私有资源下载链接
107
+
108
+ Args:
109
+ url: 私有空间资源的原始URL
110
+ expires: 下载凭证有效期,默认为3600s
88
111
112
+ Returns:
113
+ 私有资源的下载链接
114
+ """
89
115
deadline = int (time .time ()) + expires
90
116
if '?' in url :
91
117
url += '&'
@@ -97,6 +123,17 @@ def private_download_url(self, url, expires=3600):
97
123
return '{0}&token={1}' .format (url , token )
98
124
99
125
def upload_token (self , bucket , key = None , expires = 3600 , policy = None , strict_policy = True ):
126
+ """生成上传凭证
127
+
128
+ Args:
129
+ bucket: 上传的空间名
130
+ key: 上传的文件名,默认为空
131
+ expires: 上传凭证的过期时间,默认为3600s
132
+ policy: 上传策略,默认为空
133
+
134
+ Returns:
135
+ 上传凭证
136
+ """
100
137
if bucket is None or bucket == '' :
101
138
raise ValueError ('invalid bucket name' )
102
139
@@ -119,6 +156,17 @@ def __upload_token(self, policy):
119
156
return self .token_with_data (data )
120
157
121
158
def verify_callback (self , origin_authorization , url , body , content_type = 'application/x-www-form-urlencoded' ):
159
+ """回调验证
160
+
161
+ Args:
162
+ origin_authorization: 回调时请求Header中的Authorization字段
163
+ url: 回调请求的url
164
+ body: 回调请求的body
165
+ content_type: 回调请求body的Content-Type
166
+
167
+ Returns:
168
+ 返回true表示验证成功,返回false表示验证失败
169
+ """
122
170
token = self .token_of_request (url , body , content_type )
123
171
authorization = 'QBox {0}' .format (token )
124
172
return origin_authorization == authorization
0 commit comments