22
22
"""
23
23
24
24
# [START storage_signed_url_all]
25
- # [START storage_signed_url_dependencies]
26
25
import binascii
27
26
import collections
28
27
import datetime
33
32
import six
34
33
from six .moves .urllib .parse import quote
35
34
36
- # [START storage_signed_url_signer]
37
35
# pip install google-auth
38
36
from google .oauth2 import service_account
39
37
40
- # [END storage_signed_url_signer]
41
- # [END storage_signed_url_dependencies]
42
-
43
38
44
39
def generate_signed_url (service_account_file , bucket_name , object_name ,
45
40
subresource = None , expiration = 604800 , http_method = 'GET' ,
@@ -49,30 +44,21 @@ def generate_signed_url(service_account_file, bucket_name, object_name,
49
44
print ('Expiration Time can\' t be longer than 604800 seconds (7 days).' )
50
45
sys .exit (1 )
51
46
52
- # [START storage_signed_url_canonical_uri]
53
47
escaped_object_name = quote (six .ensure_binary (object_name ), safe = b'/~' )
54
48
canonical_uri = '/{}' .format (escaped_object_name )
55
- # [END storage_signed_url_canonical_uri]
56
49
57
- # [START storage_signed_url_canonical_datetime]
58
50
datetime_now = datetime .datetime .utcnow ()
59
51
request_timestamp = datetime_now .strftime ('%Y%m%dT%H%M%SZ' )
60
52
datestamp = datetime_now .strftime ('%Y%m%d' )
61
- # [END storage_signed_url_canonical_datetime]
62
53
63
- # [START storage_signed_url_credentials]
64
- # [START storage_signed_url_signer]
65
54
google_credentials = service_account .Credentials .from_service_account_file (
66
55
service_account_file )
67
- # [END storage_signed_url_signer]
68
56
client_email = google_credentials .service_account_email
69
57
credential_scope = '{}/auto/storage/goog4_request' .format (datestamp )
70
58
credential = '{}/{}' .format (client_email , credential_scope )
71
- # [END storage_signed_url_credentials]
72
59
73
60
if headers is None :
74
61
headers = dict ()
75
- # [START storage_signed_url_canonical_headers]
76
62
host = '{}.storage.googleapis.com' .format (bucket_name )
77
63
headers ['host' ] = host
78
64
@@ -82,19 +68,15 @@ def generate_signed_url(service_account_file, bucket_name, object_name,
82
68
lower_k = str (k ).lower ()
83
69
strip_v = str (v ).lower ()
84
70
canonical_headers += '{}:{}\n ' .format (lower_k , strip_v )
85
- # [END storage_signed_url_canonical_headers]
86
71
87
- # [START storage_signed_url_signed_headers]
88
72
signed_headers = ''
89
73
for k , _ in ordered_headers .items ():
90
74
lower_k = str (k ).lower ()
91
75
signed_headers += '{};' .format (lower_k )
92
76
signed_headers = signed_headers [:- 1 ] # remove trailing ';'
93
- # [END storage_signed_url_signed_headers]
94
77
95
78
if query_parameters is None :
96
79
query_parameters = dict ()
97
- # [START storage_signed_url_canonical_query_parameters]
98
80
query_parameters ['X-Goog-Algorithm' ] = 'GOOG4-RSA-SHA256'
99
81
query_parameters ['X-Goog-Credential' ] = credential
100
82
query_parameters ['X-Goog-Date' ] = request_timestamp
@@ -111,40 +93,30 @@ def generate_signed_url(service_account_file, bucket_name, object_name,
111
93
encoded_v = quote (str (v ), safe = '' )
112
94
canonical_query_string += '{}={}&' .format (encoded_k , encoded_v )
113
95
canonical_query_string = canonical_query_string [:- 1 ] # remove trailing '&'
114
- # [END storage_signed_url_canonical_query_parameters]
115
96
116
- # [START storage_signed_url_canonical_request]
117
97
canonical_request = '\n ' .join ([http_method ,
118
98
canonical_uri ,
119
99
canonical_query_string ,
120
100
canonical_headers ,
121
101
signed_headers ,
122
102
'UNSIGNED-PAYLOAD' ])
123
- # [END storage_signed_url_canonical_request]
124
103
125
- # [START storage_signed_url_hash]
126
104
canonical_request_hash = hashlib .sha256 (
127
105
canonical_request .encode ()).hexdigest ()
128
- # [END storage_signed_url_hash]
129
106
130
- # [START storage_signed_url_string_to_sign]
131
107
string_to_sign = '\n ' .join (['GOOG4-RSA-SHA256' ,
132
108
request_timestamp ,
133
109
credential_scope ,
134
110
canonical_request_hash ])
135
- # [END storage_signed_url_string_to_sign]
136
111
137
- # [START storage_signed_url_signer]
138
112
signature = binascii .hexlify (
139
113
google_credentials .signer .sign (string_to_sign )
140
114
).decode ()
141
- # [END storage_signed_url_signer]
142
115
143
- # [START storage_signed_url_construction]
144
116
scheme_and_host = '{}://{}' .format ('https' , host )
145
117
signed_url = '{}{}?{}&x-goog-signature={}' .format (
146
118
scheme_and_host , canonical_uri , canonical_query_string , signature )
147
- # [END storage_signed_url_construction]
119
+
148
120
return signed_url
149
121
# [END storage_signed_url_all]
150
122
0 commit comments