当前位置: 首页 > 知识库问答 >
问题:

使用访问令牌签署谷歌云存储Blob

诸葛亮
2023-03-14

我找到的签名Google云存储Blob的示例和源代码都需要服务帐户凭据文件(私钥是特定的)。例如:

https://cloud.google.com/storage/docs/access-control/signing-urls-with-helpers#storage-签名url获取对象python

但是,由于我遵循此处讨论的授权流程,因此我只有OAuth2.0访问令牌(并且我没有能够访问GCS bucket/object的服务帐户的凭据文件和私钥)。因此,我想知道如何使用OAuth2.0访问令牌对blob进行签名。

我使用以下内容对blob进行签名:


# First, get access token:
service_account = "<email address of a service account>"
access_token = build(
    serviceName='iamcredentials',
    version='v1',
    http=http
).projects().serviceAccounts().generateAccessToken(
    name="projects/{}/serviceAccounts/{}".format(
        "-",
        service_account),
    body=body
).execute()["accessToken"]

credentials = AccessTokenCredentials(access_token, "MyAgent/1.0", None)

# Second, use the access token to sign a blob
url = "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/{}:signBlob".format(service_account)
encoded = base64.b64encode(blob)
sign_blob_request_body = {"payload": encoded}

response = requests.post(url,
                         data=json.dumps(sign_blob_request_body),
                         headers={
                             'Content-Type': 'application/json',
                             'Authorization': 'Bearer {}'.format(credentials.access_token)})
signature = response.json()["signedBlob"]

# Third, use the signature to create signed URL:
encoded_signature = base64.b64encode(signature)
signed_url = "https://storage.googleapis.com/<BUCKET>/<OBJECT>?" \
             "GoogleAccessId={}&" \
             "Expires={}&" \
             "Signature={}".format(service_account, 
                                   expiration, 
                                   encoded_signature)
<Error>
    <Code>SignatureDoesNotMatch</Code>
    <Message>
        The request signature we calculated does not match the signature you provided. Check your Google secret key and signing method.
    </Message>
    <StringToSign>GET 1561832204 /<BUCKET>/<OBJECT></StringToSign>
</Error>

共有1个答案

赖淇
2023-03-14

如果您不想使用API密钥,请按照本示例中描述的过程操作,该过程使用IAMCresidences.signBlob()API对服务帐户的URL进行“远程”签名,而无需分发API密钥。

签名字符串(必须签名)具有以下格式:

signature_string = ('{verb}\n'
                    '{content_md5}\n'
                    '{content_type}\n'
                    '{expiration}\n'
                    '{resource}')
 类似资料:
  • 我尝试使用下面列出的示例对存储API进行JWT调用,并做了如下更改- 在这里叫它 但是获取错误as无法解析指定的URI。非法URI。 我不明白为什么它是一个非法的URI。我尝试了https://googleapis.com/storage/b/BUCKETNMAE,但还是一样的错误。在SO或谷歌文档上找不到任何关于这个的东西。任何想法我在这里做什么错了吗?

  • 我是谷歌API新手,几天来我一直在尝试使用服务帐户将内容上传到谷歌云存储桶。我能够做到这一点,但只能使用从谷歌API游乐场获得的临时访问令牌,我需要能够获得新的访问令牌,以便服务帐户能够始终上载内容。 我一直在尝试以下方法,但我一直被拒绝访问,即使有问题的帐户具有“所有者”权限。 答复: 当我运行时,我得到了正确的项目,该帐户是我的工作电子邮件,也是谷歌云的所有者。 提前谢谢!

  • 我使用Reactjs创建一个网站并将其托管在Firebase上,并使用google cloud函数上的和设置,以处理函数。网站有一个

  • 我试图设计一个应用程序,从我的谷歌云存储帐户下载适当的声音文件。该应用程序不访问用户帐户,但我自己的帐户。 我的阅读让我相信,最合适的模式是服务账户https://code.google.com/p/google-api-java-client/wiki/OAuth2#Service_Accounts 不幸的是,开发人员决定不提供Android的例子。他们确实提供了一个很好的例子,只是简单的Jav

  • 我试图与谷歌云存储使用凭证令牌进行身份验证。在node.jsGCS api文档中找不到关于如何做到这一点的示例。它们指示生成并下载包含私钥的json文件,然后链接到文件系统上的路径,如下所示: 这个很好用。 然而,我不想将我的密钥保存为JSON文件,而是创建凭据并将其保存为环境变量: 我尝试使用服务号HMAC访问密钥从桶的设置、互操作性菜单中获取此令牌。 当我尝试使用上面的身份验证方法从bucke

  • 我正在使用请求将文件上传到谷歌云存储。 请求是: 我得到以下错误作为响应: 我在某处读到,我需要打开谷歌云存储JSON API。是否必须打开谷歌云存储JSON API,或者是否有其他解决方案来修复此错误?