GCS Generate_Signed_Url истекает после загрузки - PullRequest
0 голосов
/ 27 июня 2019

Я реализую некоторый код для генерации подписанного URL для некоторых изображений, указанных в файле json, этот метод используется для их генерации

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 ]

1 голос
/ 27 июня 2019

Ваш параметр url_lifetime не инициализирован правильно.Правильное значение - expiration date, которое является значением в секундах с 1 января 1970 года по Гринвичу.Срок действия истек через час до 1970 года.

Правильный метод - current time + 3600 секунд.

Существует много способов узнать текущее время.Пример: int(time.time()), который возвращает текущее время в вашем часовом поясе в секундах.Обычно вы хотите преобразовать текущее время в GMT, а затем захватить секунды.

Примечание. В этом ответе я использую GMT так же, как и UTC.

from datetime import timezone, datetime
int(datetime.now(tz=timezone.utc).timestamp()
0 голосов
/ 27 июня 2019

Позвольте мне добавить два примера:

1

def _sign_gcp_blob_url (глагол, obj_path, content_type, expiration):

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_REAPICСТОМАТОЛОГИИ)

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

...