com.google.cloud.datastore.DatastoreException:请求缺少必需的身份验证凭据

时间:2018-02-28 13:07:27

标签: java google-app-engine google-cloud-platform google-cloud-datastore

我正在使用谷歌应用引擎和谷歌数据存储。 我正在使用谷歌图书馆

com.google.cloud.datastore.Datastore

我的示例代码是:

Datastore datastore = DatastoreOptions.getDefaultInstance().getService();
Key taskKey = datastore.newKeyFactory().setKind(entityName).newKey(id);
//populate some fields....
datastore.put(task);

我使用spring-boot和jetty作为容器。

在本地,它正常运行并且数据在Google数据存储区中更新。

问题是当我将应用程序部署到google-app-engine时,当我到达datastore.put方法时,我得到了下面的异常。

com.google.cloud.datastore.DatastoreException: Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.
com.google.cloud.datastore.spi.v1.HttpDatastoreRpc.translate(HttpDatastoreRpc.java:129)
com.google.cloud.datastore.spi.v1.HttpDatastoreRpc.commit(HttpDatastoreRpc.java:155)
com.google.cloud.datastore.DatastoreImpl$4.call(DatastoreImpl.java:485)

注意:在本地环境和google-app-engine中,我定义了环境变量GOOGLE_APPLICATION_CREDENTIALS,该变量指向json文件,其中包含google API生成的所有必需凭据。

先谢谢。

3 个答案:

答案 0 :(得分:2)

根据connecting to Datastore from App Engine in Java的文档,有几个选项可供选择,因此您可以选择 Objectify (第三方库),数据存储API 数据存储客户端库

使用客户端库时,您必须知道他们使用Application Default Credentials,如文档中所述,如果环境变量GOOGLE_APPLICATION_CREDENTIALS,ADC使用默认服务帐户App Engine为在该服务上运行的应用程序提供。因此,在您的情况下,我认为您不应该定义环境变量,以便App Engine使用其默认服务帐户。

答案 1 :(得分:0)

如果您仍在与com.google.cloud.datastore.DatastoreException: Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential.挣扎,则可以显式设置凭据,如下面的示例所示:

            Resource credentialsCyberpower = resourceLoader.getResource("classpath:yourservice-datastore-access.json");


            GoogleCredentials credentials = GoogleCredentials.fromStream(credentialsCyberpower.getInputStream())
                  .createScoped(Lists.newArrayList("https://www.googleapis.com/auth/cloud-platform"));
            DatastoreOptions options =
                    DatastoreOptions.newBuilder().setProjectId("XXXXXX").setCredentials(credentials).build();
            Datastore datastore = options.getService();
            ObjectifyService.init(new ObjectifyFactory(datastore));

在IAM服务帐户中生成yourservice-datastore-access.json。使用Objectify 6.0.5

答案 2 :(得分:0)

如果您将<url-stream-handler>urlfetch</url-stream-handler>与Java8和Objectify 6一起使用,则必须切换到native并启用计费。

我最近受到这个问题的困扰,并花了很多时间解决该问题,可以找到更多信息here