Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TokenResponseException:在独立应用程序上使用Java中AppEngine的RemoteAPI和OAuth 2.0时,缺少作用域_Java_Google App Engine_Google Oauth - Fatal编程技术网

TokenResponseException:在独立应用程序上使用Java中AppEngine的RemoteAPI和OAuth 2.0时,缺少作用域

TokenResponseException:在独立应用程序上使用Java中AppEngine的RemoteAPI和OAuth 2.0时,缺少作用域,java,google-app-engine,google-oauth,Java,Google App Engine,Google Oauth,我的目标是让我的独立应用程序访问Google App Engine应用程序的数据存储,以便我可以查询它。我的应用程序以前使用ClientLogin,但有人要求我使用OAuth 2.0进行身份验证(使用ClientLogin不再有效) 我按照本页上的说明进行操作: 我使用提供的代码,创建了一个服务帐户,下载了json密钥,创建了一个指向该密钥的环境变量。结果是我得到以下异常: Exception in thread "main" java.lang.ExceptionInInitializerEr

我的目标是让我的独立应用程序访问Google App Engine应用程序的数据存储,以便我可以查询它。我的应用程序以前使用ClientLogin,但有人要求我使用OAuth 2.0进行身份验证(使用ClientLogin不再有效)

我按照本页上的说明进行操作:

我使用提供的代码,创建了一个服务帐户,下载了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
线程“main”java.lang.ExceptionInInitializeError中的异常 在myApplication.myClass4.moveResultsOffature(myClass4.java:51)中 在myApplication.myClass2.migrate(MyClass3.java:32) 在myApplication.myClass1.main(Starter.java:11) 原因:java.lang.RuntimeException:无法获取Google应用程序默认凭据。 位于com.google.appengine.tools.remoteapi.remoteapipoptions.useApplicationDefaultCredential(remoteapipoptions.java:163) 在commonMigration.RemoteOptions.(RemoteOptions.java:18) ... 3个以上 原因:com.google.appengine.repackaged.com.google.api.client.auth.oauth2.TokenResponseException:400错误请求 { “错误”:“无效的\u范围”, “错误描述”:“不允许作用域为空或缺失。” } 位于com.google.appengine.repackaged.com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:105) 位于com.google.appengine.repackaged.com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:287) 位于com.google.appengine.repackaged.com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:307) 在com.google.appengine.repackaged.com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:384)上 位于com.google.appengine.repackaged.com.google.api.client.auth.oauth2.Credential.refreshtToken(Credential.java:489) 位于com.google.appengine.tools.remoteapi.remoteapipoptions.useApplicationDefaultCredential(remoteapipoptions.java:160) ... 4更多 这似乎指向了一个缺失的范围参数,这个问题在网页上的解释中没有提到。有没有简单的方法来解决这个问题

根据请求,我的代码(简化):

公共类堆栈溢出{
私有静态remoteapipoptions REMOTE\u OPTIONS=新的remoteapipoptions().server(
.appspot.com,443)
.useApplicationDefaultCredential();
公共静态void main(字符串[]args0)引发IOException{
//建立联系
RemoteApiInstaller=新的RemoteApiInstaller();
//从本地加载
安装程序。安装(远程_选项);
试一试{
//我的手术
}最后{
installer.uninstall();
}
}
}

这是当前远程API的一个限制。见附注:

注意:对useApplicationDefaultCredential()的远程API调用只能使用gcloud命令提供的凭据

(您可能在添加注释之前遵循了说明,因为这是最近发现的限制)。该限制将在将来的版本中修复。现在,您应该运行:

gcloud auth login

并使用您的用户帐户使用
useApplicationDefaultCredential()
进行身份验证。或者,您可以使用带有
.useServiceAccountCredential
的服务帐户,该帐户接受服务帐户电子邮件和
p12
文件的路径,而不是
json
文件。

您可以显示您的代码吗?当然,我刚刚将其作为编辑。谢谢您的提示,但我已经执行了检查。我读过博士学位,他的结论是Java中的OAuth2.0并不完整;导轨上有洞。除此之外,将p12或json文件的路径设置为环境变量并没有起到作用。当使用p12时,您需要对远程API使用不同的方法调用,以正确设置作用域。使用
useApplicationDefaultCredentials
时未正确设置作用域。我自己只使用了json文件,但正如您在我的原始帖子中看到的,这个错误也是一个缺失的范围。您能告诉我这些不同的方法调用是什么吗?正如我在回答中提到的:
RemoteApiOptions
有两个独立的方法:
useApplicationDefaultCredential()
,它从
GOOGLE\u应用程序\u credentials
环境变量指定的json文件中提取您的服务帐户凭据。由于缺少作用域,此操作现在不起作用。相反,请使用
useServiceAccountCredential(…)
,它接受服务帐户电子邮件和p12私钥文件的路径。此方法确实正确设置了作用域。谢谢!我来看看!
gcloud auth login