GCP(CloudStorage) で署名付き URL を作成する

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

 

  • 左側が有効期限内にアクセスした時に見える結果です
  • 右側が有効期限が過ぎた際に見える結果です

参考情報

PythonでGoogle Cloud Storageの署名付きURLを作成する