Java 通过谷歌应用引擎的谷歌驱动API

Java 通过谷歌应用引擎的谷歌驱动API,java,google-app-engine,google-api,google-drive-api,Java,Google App Engine,Google Api,Google Drive Api,我正试图通过GoogleAppEngine提供的界面使用GoogleDriveAPI。这基本上允许我的web应用程序与Google的API通信 我不需要我的用户登录,我只需要显示我自己的谷歌硬盘文档 然而,在我设置了所有适当的值和范围,并在控制台页面上启用了所有正确的Google Drive旋钮之后,我仍然可以通过一个简单的get请求https://www.googleapis.com/drive/v2/files: { "error": { "errors": [ { "domain": "u

我正试图通过GoogleAppEngine提供的界面使用GoogleDriveAPI。这基本上允许我的web应用程序与Google的API通信

我不需要我的用户登录,我只需要显示我自己的谷歌硬盘文档

然而,在我设置了所有适当的值和范围,并在控制台页面上启用了所有正确的Google Drive旋钮之后,我仍然可以通过一个简单的get请求
https://www.googleapis.com/drive/v2/files

{ "error": { "errors": [ { "domain": "usageLimits", "reason": "dailyLimitExceededUnreg", "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.", "extendedHelp": "https://code.google.com/apis/console" } ], "code": 403, "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup." }}
怎么了?我错过了什么?下面是实际执行请求的代码-有趣的是,如果我使用其他API(如URL shortener API),它的效果会非常好:

var scopes = new java.util.ArrayList();                                                                                                    
scopes.add("https://www.googleapis.com/auth/drive");                                                                                       
var appIdentity = AppIdentityServiceFactory.getAppIdentityService();                                                                       
var accessToken = appIdentity.getAccessToken(scopes);

var url = new URL("https://www.googleapis.com/drive/v2/files");                                                                            
var connection = url.openConnection();                                                                                                     
connection.setDoOutput(true);                                                                                                              
connection.setRequestMethod("GET");                                                                                                        
connection.addRequestProperty("Content-Type", "application/json");                                                                         
connection.addRequestProperty("Authorization", "OAuth " + accessToken.getAccessToken());
编辑

例如,如果我简单地将API更改为使用
urlshortner
API,它可以工作:

var url=新url(“https://www.googleapis.com/urlshortener/v1/url/history");

和输出:

{“种类”:“urlshortener#urlHistory”,“totalItems”:0,“itemsPerPage”:30}

那么一定有什么东西不适用于谷歌硬盘和应用程序标识

编辑2

我从正确的答案中找到了一些帮助:


但这是关于在谷歌应用程序上设置客户端API范围的,我不是在使用谷歌应用程序,我只是在使用谷歌应用程序引擎的域名
foo.appspot.com

AFAICT,您应该在授权头中使用
承载

可能发生的情况是,驱动器API无法识别服务帐户(因为标头错误?),因此将其视为匿名请求,因为也没有提供任何
key
参数(请参阅)

试试这个:

connection.addRequestProperty("Authorization", "Bearer " + accessToken.getAccessToken());

或者您可以尝试将令牌添加为
access\u-token
query-param。

我认为您至少应该在以下位置设置一个启用了驱动器API的API控制台条目:
一旦你创建了它,你就会得到一个可以在你的GoogleCredential对象中使用的ID。您可以从GoogleCredential对象获取访问令牌,然后将其添加到请求中。

您得到的403错误意味着get中没有授权头。逻辑是,如果没有授权头,您是匿名的(您是legion blah:-)。匿名使用的驱动器配额为零,因此会显示此消息。URL shortener有一个更高的匿名配额,所以它可以工作

我建议您将URL更改为指向您自己的http服务器,并检查您实际发送的标题

这表明:

驱动器SDK不支持服务帐户,因为其 安全模型

如果仍然是这样,一种解决方法是使用常规Google帐户执行一次常规OAuth舞蹈,并将访问和刷新令牌持久保存在数据存储中。

我在这里读到()的内容是,您使用了一种稍微不同的样式,使用从开发人员控制台检索的API密钥。
对我来说,相关的部分是生成一个“服务器应用程序密钥”,然后使用这种技术,这是我在其他任何地方都没有读过的

      HttpTransport httpTransport = new NetHttpTransport();
  JsonFactory jsonFactory = new JacksonFactory();
  AppIdentityCredential credential =
      new AppIdentityCredential.Builder(DriveScopes.DRIVE).build();
  // API_KEY is from the Google Console as a server API key
  GoogleClientRequestInitializer keyInitializer =
      new CommonGoogleClientRequestInitializer(API_KEY);
  Drive service = new Drive.Builder(httpTransport, jsonFactory, null)
      .setHttpRequestInitializer(credential)
      .setGoogleClientRequestInitializer(keyInitializer)
      .build();

这是Java吗?使用
var
?您可能希望使用Google提供的OAuth/API库,这将消除一些用户出错的机会。人力资源管理,但这是一个简单的休息电话。我不想为了休息而使用一个完整的图书馆。是的,它仍然是JVM(Rhino)。但是我可以使用相同的API。
addRequestProperty
添加了一个头,而不是一个查询参数,对吗?也许可以尝试记录您返回的访问令牌,并手动尝试使用该令牌的请求?您不应该在授权标头中使用“Bearner”而不是OAuth吗?@JasonHall我编辑了一个问题,显示如果我使用不同的API,例如urlshortener.hi alex,同样的代码也可以工作。我尝试将其更改为Bearer,还直接在url中传递了
access\u令牌
,但我得到了相同的错误。您知道我是否需要在Api控制台页面中设置其他内容吗?我是否也需要启用驱动器SDK?我在网上找不到任何与此相关的信息。你也可以查看我编辑的问题。如果我使用不同的API,比如urlshortener,我将展示API是如何工作的。身份验证部分正常吗?对不起,我认为您启用了驱动器API是理所当然的。是吗?另外,别忘了将你的应用程序添加到API控制台上的团队成员列表选项卡中。请注意,有驱动SDK和驱动API。从你的代码判断,我想你只需要后者。你说的团队成员是什么意思?我该怎么做?我没有触及团队成员部分。GoogleCredential:和AppIdentityCredential:这对你有用吗?我想避免仅仅为了一个简单的REST调用而使用完整的库。我想知道为什么你不能在App Engine App Identity API中设置
serviceAccountId
。我让它与serviceAccountId一起工作,但你也可以使用AppIdentityCredential。我认为这是他们做这件事最快的方法。如果不想使用该库,请确保阅读此处提供的文档并创建自己的实现。我怀疑它是否会更有效(至少不是时间方面的)@stefanhogendorn你必须在API控制台中设置任何东西才能工作吗?我已启用驱动器API。我认为这是我在权限方面必须做的额外事情?内部应用程序引擎API应该为我处理所有这些,这是我一直在线阅读的内容。因此,在权限方面,我肯定缺少一些东西——比如我需要以某种方式授予对我的服务帐户的访问权。我可以使用API读取我的urlshortener历史记录,因此它不能是匿名的,对吗?有没有办法记录发送的头?我没有http服务器。在使用开发服务器时,您是否会遇到相同的错误,或者仅在appspot.com上出现相同的错误?如果在Dev上出现错误,可以在localhost上设置服务器并使用它。另一种方法是更换驱动器