google app engine(spring boot)使用数据存储进行本地测试会出现Unauthenticated错误

时间:2017-11-30 21:40:24

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

在本地数据存储区上运行的Google灵活应用引擎春季启动项目在保存实体时提供com.google.cloud.datastore.DatastoreException Unauthenticated例外。

{
   "timestamp": 1512077140003,
   "status": 500,
   "error": "Internal Server Error",
   "exception": "com.google.cloud.datastore.DatastoreException",
   "message": "Unauthenticated.",
   "path": "/users"
}

错误说明here表示请求标头没有有效的身份验证标头,但是没有提到放置auth标头的位置。

任何人都面临同样的情况?

2 个答案:

答案 0 :(得分:5)

规范错误代码: UNAUTHENTICATED

说明com.google.cloud.datastore.DatastoreException只表示该请求没有有效的身份验证凭据。

推荐的操作:如果不解决问题,请勿重试。在这种情况下,您需要再次检查登录凭据。

可在此页面https://cloud.google.com/datastore/docs/concepts/errors#error_codes

找到更多阅读材料

<强>解决方案:

只需运行gcloud beta auth application-default login即可。 但我花了半天时间才发现它there。 我认为gcloud init应该足够了。作为替代方案,您可以通过Google OAuth2使用Google身份验证,但这很难。

答案 1 :(得分:0)

我最终转向了另一个方向。

  1. 您可以验证和使用远程数据存储,例如Amar mentioned;
  2. 您还可以获取凭据,将其存储在本地,使用application.propertiesspring.cloud.gcp.datastore.credentials.location=file://FULL_PATH_TO_THE_CREDENTIALS_FILE中引用它,并且仍然使用远程数据存储区;
  3. 但是我最喜欢的选择是使用数据存储区模拟器在本地完全运行它,因此根本不需要身份验证:

src/test/resources/application.properties

    # if it exists, comment out or delete the following property:
    # spring.cloud.gcp.datastore.credentials.location

    # add the following
    spring.cloud.gcp.emulator-enabled=true

    # if you're not using environment variables, make sure the following property exists
    spring.cloud.gcp.project-id=your-project-id

请注意,如果您正在运行集成测试,或者混合使用远程和本地测试,则每个测试可能需要不同的.properties文件。

您的考试班

    private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

    private static LocalDatastoreHelper helper;

    @BeforeClass
    public static void setUpClass() throws IOException, InterruptedException {
        logger.info("[Datastore-Emulator] start");
        helper = LocalDatastoreHelper.create();
        helper.start();
        logger.info("[Datastore-Emulator] listening on port {}", helper.getPort());

        System.setProperty(DatastoreHelper.LOCAL_HOST_ENV_VAR, "localhost:" + helper.getPort());
    }

    @AfterClass
    public static void cleanUpClass() throws InterruptedException, TimeoutException, IOException {
        logger.info("[Datastore-Emulator] stop");
        helper.stop();
    }

    @Before
    public void init() throws IOException {
        logger.info("[Datastore-Emulator] cleaning data");
        helper.reset();
    }

这种方法非常适合存储库(org.springframework.cloud.gcp.data.datastore.repository.DatastoreRepository),但是如果您想直接使用Datastore,则可以check this

参考