GCS Generate_Signed_Url在加载后过期

时间:2019-06-27 12:19:05

标签: python url google-cloud-platform google-cloud-storage

我正在实现一些代码来为json文件中指定的某些图像生成一个签名的url,这是用于生成它们的方法

def geturl(image_name):
    storage_client = storage.Client()
    bucket = 'Bucket Name'
    source_bucket = storage_client.get_bucket(bucket)
    blobs = source_bucket.list_blobs()
    for blob in blobs:
        if image_name == blob.name:
            url_lifetime = 3600
            serving_url = blob.generate_signed_url(url_lifetime)
            return serving_url
    return 

此后,它们在img scr <>中使用,但是在加载页面时,图像不加载,并且在url之后,我收到错误消息

提供的令牌已过期 请求签名已过期:1970-01-01T10:00:00 + 00:00

即使更改生命周期,错误消息仍然存在

2 个答案:

答案 0 :(得分:1)

您的参数url_lifetime未正确初始化。正确的含义是expiration date,它是从格林尼治标准时间1970年1月1日开始的秒数。您的有效期限是从1970年开始的一个小时。

正确的方法是current time + 3600秒。

有许多获取当前时间的方法。示例:int(time.time())以秒为单位返回您时区中的当前时间。通常,您将需要将当前时间转换为格林尼治标准时间,然后获取秒数。

注意:在这个答案中,我使用的格林威治标准时间与UTC相同。

from datetime import timezone, datetime
int(datetime.now(tz=timezone.utc).timestamp()

答案 1 :(得分:0)

让我添加两个示例:

1

def _sign_gcp_blob_url(动词,obj_path,content_type,有效期):

from oauth2client.service_account import ServiceAccountCredentials

import base64

from six.moves.urllib.parse import urlencode, quote

GCS_API_ENDPOINT = 'https://storage.googleapis.com'

expiration_in_epoch = int(expiration.timestamp())

signature_string = ('{verb}\n'

                '{content_md5}\n'

                '{content_type}\n'

                '{expiration}\n'

                '{resource}')

signature = signature_string.format(verb=verb,

    content_md5='',

    content_type='',

    expiration=expiration_in_epoch,

    resource=obj_path)

creds = 

ServiceAccountCredentials.from_json_keyfile_name(settings.GOOGLE_APPLICATION_CRE 牙齿)

signature = creds.sign_blob(signature)[1]

encoded_signature = base64.b64encode(signature)

base_url= GCS_API_ENDPOINT + obj_path

storage_account_id = creds.service_account_email

return '{base_url}?GoogleAccessId={account_id}&Expires={expiration}&Signature={signature}'.format(base_url=base_url,
    account_id=storage_account_id,
    expiration = expiration_in_epoch,
    signature=quote(encoded_signature))

示例2

https://github.com/GoogleCloudPlatform/storage-signedurls-python/commit/828486a99e34d38fc3ccbb434899284c8b069044