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