Python 代码是否始终需要服务帐户来生成签名网址以便在谷歌云上上传?

Sit*_*mba 2 python java authentication google-cloud-storage google-cloud-platform

有没有办法通过使用 python 中的应用程序默认凭据来生成签名的 url?我看到java中使用对象对它的支持storage

在网上可用的 python 代码上它说:

def generate_upload_signed_url_v4(bucket_name, blob_name):
    """Generates a v4 signed URL for uploading a blob using HTTP PUT.

    Note that this method requires a service account key file. You can not use
    this if you are using Application Default Credentials from Google Compute
    Engine or from the Google Cloud SDK.
    """
Run Code Online (Sandbox Code Playgroud)

我想知道是否有像 Java 中那样使用应用程序默认凭据而不是服务帐户凭据的方法

Joh*_*ley 6

应用程序默认凭据 (ADC) 支持从元数据服务(Compute Engine、Cloud Run、Cloud Functions 等)获取令牌。这意味着私钥不可用于签署数据。在这种情况下,您有两个选择:提供服务帐号 JSON 密钥或使用 Google Cloud IAM 为您签署请求。

要使用 IAM 签名 API,服务账户必须具有 IAM 角色Service Account Token Creator

当可用凭据 (ADC) 不提供服务帐户私钥时,以下方法支持创建签名 URL。注意:某些服务不提供服务帐户电子邮件地址。在这种情况下,您必须查找或硬编码电子邮件地址。

示例代码:

import datetime as dt
from google import auth
from google.cloud import storage

credentials, project = auth.default()
credentials.refresh(auth.transport.requests.Request())

expiration = dt.timedelta(days=1)

client = storage.Client(credentials=credentials)
bucket = storage_client.get_bucket("bucketName")
blob = bucket.get_blob("blobName")

signed_url = blob.generate_signed_url(
    expiration=expiration,
    service_account_email=credentials.service_account_email,
    access_token=credentials.token
)
Run Code Online (Sandbox Code Playgroud)

您可以指定 HTTP 方法和内容类型:

signed_url = blob.generate_signed_url(
    expiration=expiration,
    service_account_email=credentials.service_account_email,
    access_token=credentials.token,
    method="PUT",
    content_type="application/octet-stream"
)
Run Code Online (Sandbox Code Playgroud)

如果您收到 IAM 权限错误,请仔细检查分配给用于 ADC 的服务账户的 IAM 角色。

另外,请参阅@guillaume-blaquiere 的回答