如何使用Google云端存储验证我的Java应用程序?

时间:2016-02-27 21:33:46

标签: java cygwin google-cloud-storage google-cloud-platform gcloud-java

我正在编写一个Java应用程序来与Google云端存储中的文件进行交互。我找到了gcloud-java我试图开始工作。

查看他们的examples似乎我应该能够在使用gcloud登录后简单地运行它们,但它似乎并没有起作用。我试图运行StorageExample,其中说如果没有提供" 登录项目将会被使用"但是尽管登录我无法访问我的预测我是否指定它。

$ gcloud auth login
Your browser has been opened to visit:

    https://accounts.google.com/o/oauth2/auth?....


Saved Application Default Credentials.

You are now logged in as [...].
Your current project is [...].  You can change this setting by running:
  $ gcloud config set project PROJECT_ID

$ java -cp GCloudDemo.jar com.google.gcloud.examples.storage.StorageExample list
Exception in thread "main" java.lang.IllegalArgumentException: A project ID is required for this service but could not be determined from the builder or the environment.  Please set a project ID using the builder.
        at com.google.common.base.Preconditions.checkArgument(Preconditions.java:122)
        at com.google.gcloud.ServiceOptions.<init>(ServiceOptions.java:317)
        ...
        at com.google.gcloud.examples.storage.StorageExample.main(StorageExample.java:566)

$ java -cp GCloudDemo.jar com.google.gcloud.examples.storage.StorageExample ... list
Exception in thread "main" com.google.gcloud.storage.StorageException: Login Required
        at com.google.gcloud.spi.DefaultStorageRpc.translate(DefaultStorageRpc.java:94)
        at com.google.gcloud.spi.DefaultStorageRpc.list(DefaultStorageRpc.java:148)
        ...
        at com.google.gcloud.examples.storage.StorageExample$ListAction.run(StorageExample.java:1)
        at com.google.gcloud.examples.storage.StorageExample.main(StorageExample.java:579)
Caused by: com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized
{
  "code" : 401,
  "errors" : [ {
    "domain" : "global",
    "location" : "Authorization",
    "locationType" : "header",
    "message" : "Login Required",
    "reason" : "required"
  } ],
  "message" : "Login Required"
}
        at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:145)
        ...
        at com.google.gcloud.spi.DefaultStorageRpc.list(DefaultStorageRpc.java:138)
        ... 10 more

显然我的环境有问题,但我需要做些什么才能修复它?我想纠正我的环境,而不是对示例进行更改。

注意:

  • 我在Windows 10上运行Cygwin 2.0.4
  • 我没有通过Maven构建,但我假设不是问题的根源

1 个答案:

答案 0 :(得分:1)

gcloud auth login不起作用的原因是因为Java与Cygwin没有很好的配合,特别是在绝对路径方面。

gcloud将您的设置和凭据存储在Cygwin主目录~/.config/gcloud中,但Java将通过{{3}在 Windows 主目录中查找它们}。您可以通过CLOUDSDK_CONFIG环境变量指定应用程序在此目录中的位置,这样(确保仅在调用java时指定它;为shell设置它将依次中断{{1 }}):

gcloud

请注意,我们没有必要指定项目,但由于某种原因我们仍然没有登录。事实证明,演示应用程序在报告身份验证错误方面做得不是很好。在$ CLOUDSDK_CONFIG=$(cygpath -w ~/.config/gcloud) \ java -cp GCloudDemo.jar com.google.gcloud.examples.storage.StorageExample list Exception in thread "main" com.google.gcloud.storage.StorageException: Login Required at .... 方法开头添加对AuthCredentials.createApplicationDefaults()的显式调用会报告更有用的错误消息:

main()

所以现在我们至少要让Exception in thread "main" java.io.IOException: The Application Default Credentials are not available. They are available if running in Google Compute Engine. Otherwise, the environment variable GOOGLE_APPLICATION_CREDENTIALS must be defined pointing to a file defining the credentials. See https://developers.google.com/accounts/docs/application-default-credentials for more information. 环境变量继续下去。但为什么我们没有GOOGLE_APPLICATION_CREDENTIALS为我们配置东西?看起来它实际上是图书馆中的System.getProperty("user.home");它应该现在能够找到我们的登录令牌。

与此同时,我们也可以通过明确指定凭据路径来解决它:

gcloud

成功!