V4 签名是一个过程,可用于在 Cloud Storage XML API 请求中为身份验证生成签名。本页面介绍了如何使用 Google Cloud CLI 和 Cloud Storage 客户端库,通过服务账号凭据创建签名网址。签名网址可提供针对特定 Cloud Storage 资源的限时读取或写入权限。如果您要执行自己的程序来创建签名网址,请改为参阅使用自己的程序执行 V4 签名。
准备工作
如需创建签名网址,请完成以下部分中的任务。
启用 Service Account Credentials API
Enable the Service Account Credentials API.
获取所需角色
如需获得创建签名网址以下载和上传对象所需的权限,请让您的管理员授予以下角色:
Storage Object User (
roles/storage.objectUser
):下载、上传和覆盖对象需要此角色。应将此角色授予其密钥用于对网址进行签名的服务账号。如果您只想下载对象,请让您的管理员为该服务账号授予 Storage Object Viewer (
roles/storage.objectViewer
) 角色,而不是 Storage Object User 角色。如果您只想上传对象(而不覆盖),请让您的管理员为该服务账号授予 Storage Object Creator (
roles/storage.objectCreator
) 角色,而不是 Storage Object User 角色。
Service Account Token Creator (
roles/iam.serviceAccountTokenCreator
):在本地未提供私钥文件时为服务账号生成短期有效的凭据需要此角色。应将此角色授予创建签名网址的主账号。如果您使用用户凭据进行身份验证,则您的用户身份必须具有此角色,并且必须修改命令以模拟用于对网址进行签名的服务账号。
如果您使用关联到计算实例的服务账号进行身份验证,则该服务账号必须具有此角色来模拟自身,并且您必须修改命令以模拟用于对网址进行签名的服务账号。
如果您使用私钥文件进行身份验证,则不需要此角色。
这些预定义角色可提供服务账号使用签名网址下载和上传对象所需的权限。如需查看所需的确切权限,请展开所需权限部分:
所需权限
storage.objects.get
storage.objects.create
(如果您只想下载对象,则无需此权限)storage.objects.delete
(如果上传时不需要覆盖对象,则无需此权限)iam.serviceAccounts.signBlob
(如果您打算在本地提供服务账号密钥来创建签名,这不需要调用signBlob
方法,则无需此权限)
您也可以使用自定义角色或其他预定义角色来获取这些权限。要查看哪些角色与哪些权限相关联,请参阅适用于 Cloud Storage 的 IAM 角色。
如需了解如何授予项目的角色,请参阅管理对项目的访问权限。
创建签名网址以下载对象
如需创建可以从存储分区获取对象的签名网址,请完成以下步骤:
命令行
生成新的私钥,或使用现有私钥作为服务账号。密钥应采用 JSON 格式。
如需详细了解私钥和服务账号,请参阅服务账号。
使用
gcloud storage sign-url
命令。 例如,以下命令会创建一个签名网址,以允许用户下载对象 10 分钟:gcloud storage sign-url gs://BUCKET_NAME/OBJECT_NAME --private-key-file=KEY_FILE --duration=10m
其中:
BUCKET_NAME
是对象所在的存储桶的名称。例如example-bucket
。OBJECT_NAME
是要下载的对象的名称,例如cat.jpeg
。KEY_FILE
是包含服务账号私钥的文件的路径。例如Desktop/private-key.json
。
如果成功,响应应如下所示:
--- expiration: '2023-07-14 23:19:35' http_verb: GET resource: gs://example-bucket/cat.jpeg signed_url: https://storage.googleapis.com/example-bucket/cat.jpeg? x-goog-signature=11ae9c61ca84dd0bec319f7d52a38029e5873caa2eeced0568 ef96076258cfc1a925a9683cc907d210036b61af9e06a13bf4a15b15fab3916669b e2f4c9f66ea6be822bec5858af519a6da705415b5768721197be213103fa09b8a18 8a143be77a24351517ff208a2c62cfebb78040daf1f953907080bd98f9462739d11 1355b1d9bcf54705b862f37392c031fde0d52add1a4d3bbb98a22e8b7023f6a1623 2e0a2dd56e524d410624d28663e557fafaf4ba0a04290a1066f894713857b429258 d14f056066c7622baf114c124e645688e19b4df3c4a7925f580693c93fa9c1dae7f dff0edff7259c72f3f0eadc5a9f9f556c83c9c8dc02ee3af8d20ab634bad&x-goog -algorithm=GOOG4-RSA-SHA256&x-goog-credential=example%40example-pro ject.iam.gserviceaccount.com%2F20230714%2Fus%2Fstorage%2Fgoog4_requ est&x-goog-date=20230714T221935Z&x-goog-expires=600&x-goog-signedhe aders=host
此网址可供任何人用来在指定时长内(在本例中为 10 分钟)访问关联资源(在本例中为
cat.jpeg
)。
客户端库
C++
如需了解详情,请参阅 Cloud Storage C++ API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
C#
如需了解详情,请参阅 Cloud Storage C# API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Go
如需了解详情,请参阅 Cloud Storage Go API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Java
如需了解详情,请参阅 Cloud Storage Java API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Node.js
如需了解详情,请参阅 Cloud Storage Node.js API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
PHP
如需了解详情,请参阅 Cloud Storage PHP API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Python
如需了解详情,请参阅 Cloud Storage Python API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Ruby
如需了解详情,请参阅 Cloud Storage Ruby API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
创建签名网址以上传对象
要创建能够将对象上传到存储分区的签名网址,请完成以下步骤:
命令行
生成新的私钥,或使用现有私钥作为服务账号。密钥可以是 JSON 或 PKCS12 格式。
如需详细了解私钥和服务账号,请参阅服务账号。
使用
gcloud storage sign-url
命令。 例如,以下命令会创建一个签名网址,以允许用户上传文件一小时:gcloud storage sign-url gs://BUCKET_NAME/OBJECT_NAME --private-key-file=KEY_FILE --http-verb=PUT --duration=1h --headers=Content-Type=CONTENT_TYPE
BUCKET_NAME
是对象要上传到的存储桶的名称。例如example-bucket
。OBJECT_NAME
是为上传的对象分配的名称。例如cat.png
。KEY_FILE
是包含服务账号私钥的文件的路径。例如Desktop/private-key.json
。CONTENT_TYPE
是上传的对象的内容类型。例如image/png
。
如果成功,响应应如下所示:
--- expiration: '2023-07-14 23:35:47' http_verb: PUT resource: gs://example-bucket/cat.png signed_url: https://storage.googleapis.com/example-bucket/cat.png? x-goog-signature=2f670a686102963e0574f3c1a3b4d29ee4aa406c1528d42d2 30195d17fef73834b254314de7d7990afd48538a84b66f20010e7ecd90a900490e 6119b7e56a912f71c8d64285c40e86f31b8fec51cf8c7a61ded81de3cedac9c1ca b92474b7371740fdac20b2d8d092b15396f79443bbde954a4174ed11aef6c2cf5f a4d72a84ff60fd6003ed0a505b0e40b6207ddbaec2a15778f715c3ec7537a1b14f b6661b2abaa5736f1670a412ca7e2555c830591f0595c01ff95af7f2206abe2e27 41948c16d4bd4c7cbb25f41277ece59236c06e00ca6c63ae2eb3efc22c216bb24c e1b8b3801d07fd3a7ed3f2df3db6e59c6fc3cc76a002335dd936efd0237cf584e3 6&x-goog-algorithm=GOOG4-RSA-SHA256&x-goog-credential=example%40ex ample-project.iam.gserviceaccount.com%2F20230714%2Fus%2Fstorage%2F goog4_request&x-goog-date=20230714T223547Z&x-goog-expires=3600&x-g oog-signedheaders=Content-Type%3Bhost
此网址可供任何人用来在指定时长内(在本例中为 1 小时)将资源(在本例中为
cat.png
)上传到指定的 Cloud Storage 存储桶。
客户端库
C++
如需了解详情,请参阅 Cloud Storage C++ API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
C#
如需了解详情,请参阅 Cloud Storage C# API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Go
如需了解详情,请参阅 Cloud Storage Go API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Java
如需了解详情,请参阅 Cloud Storage Java API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Node.js
如需了解详情,请参阅 Cloud Storage Node.js API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
PHP
如需了解详情,请参阅 Cloud Storage PHP API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Python
如需了解详情,请参阅 Cloud Storage Python API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Ruby
如需了解详情,请参阅 Cloud Storage Ruby API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。