我正在实现一些代码来为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
即使更改生命周期,错误消息仍然存在
答案 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