gcloud-java 身份验证数据存储(在 0.1.7/0.2.0 中升级到 v1beta3)

gcloud-java authentication datastore (upgrade to v1beta3 in 0.1.7/0.2.0)

我有一个 java GAE 应用程序 运行 使用 gcloud-java 0.1.4 一段时间,想升级到 gcloud-java 0.1.7/ 0.2.0,因为我们遇到了几个 404 等(另一个问题)。当我们连接到另一个 GAE 应用程序中的数据存储实例时,我们正在使用 gcloud。

但是升级包后,我们的认证失败了。根据我在发行说明中读到的内容,我们必须在 "host" 应用程序上重新启用数据存储区-api,所以我们做了但没有任何结果。当再次 "downgrading" 时,应用程序按预期工作,但仍然存在一些稳定性问题。

是否有其他未记录的 fixes/methods 让它工作?

我的连接 code/function 看起来像(已删除):

fis = new FileInputStream(Constants.PATH_TO_JSON_KEY);
sac = AuthCredentials.createForJson(fis); 

DatastoreOptions.Builder builder = DatastoreOptions.builder();
builder.projectId(Constants.DATASTORE_PROJECT_ID);
builder.authCredentials(sac);
DatastoreOptions options = builder.build();

return options.service();

编辑:

这是我得到的一些堆栈跟踪。

[INFO] apr 17, 2016 6:19:33 PM com.google.datastore.v1beta3.client.DatastoreFactory makeClient
[INFO] com.google.cloud.datastore.DatastoreException: Not authorized.
[INFO]  at com.google.cloud.datastore.spi.DefaultDatastoreRpc.translate(DefaultDatastoreRpc.java:102)
[INFO]  at com.google.cloud.datastore.spi.DefaultDatastoreRpc.runQuery(DefaultDatastoreRpc.java:157)
[INFO]  at com.google.cloud.datastore.DatastoreImpl.call(DatastoreImpl.java:92)
[INFO]  at com.google.cloud.datastore.DatastoreImpl.call(DatastoreImpl.java:89)
[INFO]  at com.google.cloud.RetryHelper.doRetry(RetryHelper.java:181)
[INFO]  at com.google.cloud.RetryHelper.runWithRetries(RetryHelper.java:247)
[INFO]  at com.google.cloud.RetryHelper.runWithRetries(RetryHelper.java:237)
[INFO]  at com.google.cloud.datastore.DatastoreImpl.runQuery(DatastoreImpl.java:88)
[INFO]  at com.google.cloud.datastore.QueryResultsImpl.sendRequest(QueryResultsImpl.java:73)
[INFO]  at com.google.cloud.datastore.QueryResultsImpl.<init>(QueryResultsImpl.java:57)
[INFO]  at com.google.cloud.datastore.DatastoreImpl.run(DatastoreImpl.java:82)
[INFO]  at com.google.cloud.datastore.DatastoreImpl.run(DatastoreImpl.java:73)
.....
[INFO] Caused by: com.google.datastore.v1beta3.client.DatastoreException: Not authorized., code=PERMISSION_DENIED
[INFO]  at com.google.datastore.v1beta3.client.RemoteRpc.makeException(RemoteRpc.java:126)
[INFO]  at com.google.datastore.v1beta3.client.RemoteRpc.makeException(RemoteRpc.java:169)
[INFO]  at com.google.datastore.v1beta3.client.RemoteRpc.call(RemoteRpc.java:89)
[INFO]  at com.google.datastore.v1beta3.client.Datastore.runQuery(Datastore.java:108)
[INFO]  at com.google.cloud.datastore.spi.DefaultDatastoreRpc.runQuery(DefaultDatastoreRpc.java:155)
[INFO]  ... 56 more

感谢您报告此问题。我有几个后续问题,以便我们可以深入了解:

您设置的项目 ID (Constants.DATASTORE_PROJECT_ID) 是否包含带波浪号的任何前缀,可能是 "s~" 或 "e~"? Datastore v1beta3 不再接受这些前缀;相反,您应该提供波浪号后的所有内容作为您的项目 ID。例如,如果您的项目 ID 是 s~my-project-id-123,您应该只使用 my-project-id-123。如果您看到类似于以下内容的错误消息,则可能是问题所在:

com.google.datastore.v1beta3.client.DatastoreFactory makeClient: Not using any credentials
com.google.cloud.datastore.DatastoreException: The project s~my-project-id-123 does not exist.</pre>

如果这不是问题,您介意提供堆栈跟踪和异常文本的副本(根据需要删除机密信息)。谢谢!

我们使用的服务帐户未在目标应用程序中设置适当的权限。所以我们(根据 google 的建议)在此处重新添加服务帐户作为查看者:https://console.cloud.google.com/permissions/projectpermissions

希望以后能对其他人有所帮助!