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