tl;dr;
GCP(CloudStorage) で署名付き URL を作成する方法を紹介します。
方法
requirements.txt にoauth2client を記載します。
oauth2client
install します。
pip3 install -r requirements.txt
python でスクリプトを書きます。今回は 120秒間だけ見せることにしました。
import time
import urllib
from datetime import datetime, timedelta
import os
import base64
from oauth2client.service_account import ServiceAccountCredentials
API_ACCESS_ENDPOINT = 'https://storage.googleapis.com'
def sign_url(bucket, bucket_object, method, expires_after_seconds=120):
gcs_filename = '/%s/%s' % (bucket, bucket_object)
content_md5, content_type = None, None
credentials = ServiceAccountCredentials.from_json_keyfile_name('xxxxxxxx.json')
google_access_id = credentials.service_account_email
expiration = datetime.now() + timedelta(seconds=expires_after_seconds)
expiration = int(time.mktime(expiration.timetuple()))
signature_string = '\n'.join([
method,
content_md5 or '',
content_type or '',
str(expiration),
gcs_filename])
_, signature_bytes = credentials.sign_blob(signature_string)
signature = base64.b64encode(signature_bytes)
query_params = {'GoogleAccessId': google_access_id,
'Expires': str(expiration),
'Signature': signature}
return '{endpoint}{resource}?{querystring}'.format(
endpoint=API_ACCESS_ENDPOINT,
resource=gcs_filename,
querystring=urllib.parse.urlencode(query_params))
if __name__ == '__main__':
url = sign_url('project-name', 'test/coco.png', 'GET')
print(url)
黄色で塗った部分が、主に変更する場所になります。
結果
python3 main.py
https://storage.googleapis.com/project/test/coco.png?GoogleAccessId=signed-url%40project&Expires=1581540902&Signature=xxxx
- 左側が有効期限内にアクセスした時に見える結果です
- 右側が有効期限が過ぎた際に見える結果です
参考情報
https://cloudpack.media/45121