Google cloud storage 从Grails应用程序访问Google云存储

Google cloud storage 从Grails应用程序访问Google云存储,google-cloud-storage,google-oauth,Google Cloud Storage,Google Oauth,从grails应用程序中,我想在bucket中创建一个blob。 我已经在google cloud中创建了bucket,创建了服务帐户,并向所有者提供了访问bucket的相同服务帐户。后来创建了服务帐户密钥project-id-c4b144.json,它保存所有凭证 StorageOptions storageOptions = StorageOptions.newBuilder() .setCredentials(ServiceAccou

从grails应用程序中,我想在bucket中创建一个blob。 我已经在google cloud中创建了bucket,创建了服务帐户,并向所有者提供了访问bucket的相同服务帐户。后来创建了服务帐户密钥project-id-c4b144.json,它保存所有凭证

StorageOptions storageOptions = StorageOptions.newBuilder()
                            .setCredentials(ServiceAccountCredentials
                            .fromStream(new FileInputStream("/home/etibar/Downloads/project-id-c4b144.json"))) // setting credentials
                            .setProjectId("project-id") //setting project id, in reality it is different
                            .build()
                    Storage storage=storageOptions.getService()
                    BlobId blobId = BlobId.of("dispatching-photos", "blob_name")
                    BlobInfo blobInfo = BlobInfo.newBuilder(blobId).setContentType("text/plain").build()
                    Blob blob = storage.create(blobInfo, "Hello, Cloud Storage!".getBytes(StandardCharsets.UTF_8))
当我运行这段代码时,我会收到一条json错误消息

Caused by: com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : "Caller does not have storage.objects.create access to bucket dispatching-photos.",
    "reason" : "forbidden"
  } ],
  "message" : "Caller does not have storage.objects.create access to bucket dispatching-photos."
}
|Grails版本:3.2.10 |Groovy版本:2.4.10 |JVM版本:1.8.0131

谷歌云数据存储:1.2.1

google-auth-library-oauth2-http:0.7.1


谷歌云存储:1.2.2

关于json文件对应的服务帐户——我打赌:

A) 您试图访问的存储桶属于不同的项目,而不是您将该帐户设置为存储管理员的项目


或者B)您正在为一个不同于json文件对应的服务帐户设置权限

服务帐户被视为具有自己的单独权限集的唯一用户。与凭据关联的服务帐户
project-id-c4b144.json
是否有权限在该bucket中创建对象?@Brandon Yarbrough,是的,我从json文件中获取了客户端电子邮件,并从“bucket permissions”中将其添加为bucket admin。这是您实际运行的代码吗?它看起来在语法上不有效(几行中缺少分号),并且看起来处于编辑的中间状态(似乎不需要storage.get()调用)。另外,我怀疑你的项目ID实际上不是“项目ID”-你这样做只是为了在帖子中隐藏你真正的项目ID,还是你在代码中使用的值?@Mike Schwartz,我在groovy中开发,它也运行java代码。因此,在groovy中,不需要使用分号。实际上,代码是类似的,它没有存储。get()。我更新了代码。谢谢你指出。是的,真正的项目id不同。谢谢。是的,即使两个不同的项目可以访问bucket,也会出现访问问题。因此,在我的例子中,两个项目可以访问同一个bucket(“发送照片”):project1和project2,服务帐户是根据project2创建的。因此,当我在project2下创建了另一个bucket,而project1无法访问该bucket时,在一个新bucket中创建blob是有效的。因此,我们将进一步调查这个问题。我已经放弃了你的回答,但是,目前我不确定到底是什么问题。一旦我确定,我会不断更新帖子。原因可能是您用于创建对象的服务帐户在project2上只有storage admin权限。如果希望该服务帐户能够访问project1中的存储桶,还必须将该帐户添加为project1的项目成员,并授予其存储管理员权限。