【发布时间】:2016-06-22 12:09:43
【问题描述】:
从 appengine 网络应用程序中访问 Google Cloud Storage 时,我遇到了身份验证问题。我想使用应用程序默认凭据。也许有人可以给我建议。
我有一个项目,服务帐号:“x@appspot.gserviceaccount.com”。
在 IAM 部分,该项目只有成员 y@gmail.com(这是我的电子邮件地址),角色为 Owner。
在项目中,我有两个 Cloud Storage 存储桶,staging.x.appspot.com 和 x.appspot.com。我没有编辑他们的权限。
在项目中,我有一个用 Java 编写的 appengine Web 应用程序。从它的代码中,我想像这样访问云存储:
import com.google.cloud.AuthCredentials;
import com.google.cloud.storage.Storage;
AuthCredentials credentials=AuthCredentials.createApplicationDefaults();
Storage storage=StorageOptions.builder().authCredentials(credentials).build().service();
使用 Maven 依赖项
<dependency>
<groupId>com.google.appengine</groupId>
<artifactId>appengine-api-1.0-sdk</artifactId>
<version>1.9.38</version>
</dependency>
<dependency>
<groupId>com.google.auth</groupId>
<artifactId>google-auth-library-appengine</artifactId>
<version>0.4.0</version>
</dependency>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>gcloud-java</artifactId>
<version>0.2.3</version>
</dependency>
我用
启动开发服务器mvn clean appengine:devserver
并使用
进行部署mvn clean appengine:update
我以为这就足够了。
但是在一台计算机上的 devserver 中它可以工作,在另一台计算机上我得到异常“401 Invalid authentication”或类似的东西。不知道这台电脑有什么区别。
在部署的应用程序中出现异常 403 Forbidden。
原因:com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 { “代码”:403, “错误”:[{ “域”:“全球”, “消息”:“禁止”, “原因”:“禁止” }], “消息”:“禁止” }
我做错了什么?
【问题讨论】:
-
根据developers.google.com/identity/protocols/…,应用程序默认凭据在 App Engine 本身上运行时应该可以正常工作,但如果您使用“gcloud preview app run”启动 Appengine,则默认情况下可能只能在本地工作。或者,在运行示例之前尝试运行
gcloud auth login。 -
^^ 回应这个。您需要先运行
gcloud auth login或gcloud auth activate-service-account(docs),然后默认凭据才能在 dev 中运行。 -
此线程有任何更新吗?
-
好吧,我去了存储桶配置并明确添加了用户“x@appspot.gserviceaccount.com”的权限,访问权限为“Writer”。这样我的应用程序就可以工作了,但我并没有结束这个问题,因为我认为这应该是自动的,所以也许我仍然做错了什么。
标签: java maven google-app-engine google-cloud-storage