我的目标是让我的独立应用程序访问Google应用程序的数据存储,以便我能够查询它。我的应用程序过去使用过ClientLogin,但有人要求我使用OAuth 2.0进行身份验证(并且使用ClientLogin不再有效)。
我按照这个页面上的说明:https://cloud.google.com/appengine/docs/java/tools/remoteapi
我使用所提供的代码,创建了一个服务帐户,下载了json密钥,并创建了指向此键的环境变量。结果是,我得到了以下异常:
Exception in thread "main" java.lang.ExceptionInInitializerError
at myApplication.myClass4.moveResultsOfFeature(myClass4.java:51)
at myApplication.myClass2.migrate(MyClass3.java:32)
at myApplication.myClass1.main(Starter.java:11)
Caused by: java.lang.RuntimeException: Failed to acquire Google Application Default credential.
at com.google.appengine.tools.remoteapi.RemoteApiOptions.useApplicationDefaultCredential(RemoteApiOptions.java:163)
at commonMigration.RemoteOptions.<clinit>(RemoteOptions.java:18)
... 3 more
Caused by: com.google.appengine.repackaged.com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request
{
"error" : "invalid_scope",
"error_description" : "Empty or missing scope not allowed."
}
at com.google.appengine.repackaged.com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:105)
at com.google.appengine.repackaged.com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:287)
at com.google.appengine.repackaged.com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:307)
at com.google.appengine.repackaged.com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:384)
at com.google.appengine.repackaged.com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:489)
at com.google.appengine.tools.remoteapi.RemoteApiOptions.useApplicationDefaultCredential(RemoteApiOptions.java:160)
... 4 more这似乎指向了一个缺失的范围参数,在网页上的解释中没有提到这个问题。有什么简单的方法可以解决这个问题吗?
根据请求,我的代码(简化):
public class StackOverflow {
private static RemoteApiOptions REMOTE_OPTIONS = new RemoteApiOptions().server(
<application-id>.appspot.com, 443)
.useApplicationDefaultCredential();
public static void main(String[] args0) throws IOException {
// MAKING THE CONNECTION
RemoteApiInstaller installer = new RemoteApiInstaller();
// LOAD FROM Local
installer.install(REMOTE_OPTIONS);
try {
// MY OPERATIONS
} finally {
installer.uninstall();
}
}
}发布于 2015-11-17 22:32:37
这是当前远程API的一个限制。见注这里
注意:对useApplicationDefaultCredential()的远程API调用只能使用gcloud命令提供的凭据。
(由于这是最近发现的一个限制,在添加注释之前,您可能会按照说明进行操作)。这一限制将在以后的发行版中确定。现在,您应该要么运行:
gcloud auth login并使用您的用户帐户使用useApplicationDefaultCredential()进行身份验证。或者,您可以在.useServiceAccountCredential中使用服务帐户,它接受服务帐户电子邮件和p12文件的路径,而不是json文件。
https://stackoverflow.com/questions/33655205
复制相似问题