Google Drive API通过Google App Engine

时间:2012-10-02 13:55:47

标签: java google-app-engine google-api google-drive-api

我正在尝试通过Google App Engine提供的App Identity界面使用Google Drive API。这基本上允许我的Web应用程序与Google的API from server to server进行通信。

我不需要我的用户登录,我只需要显示自己的Google云端硬盘文档。

但是,在我设置了所有适当的值和范围,并在控制台页面上启用了所有正确的Google云端硬盘旋钮之后,我仍然可以通过https://www.googleapis.com/drive/v2/files获得此简单的GET请求:

{ "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缩短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 = new URL("https://www.googleapis.com/urlshortener/v1/url/history");

输出:

{ "kind": "urlshortener#urlHistory", "totalItems": 0, "itemsPerPage": 30}

因此必须有一些与Google云端硬盘和应用识别码无关的内容?

编辑2

我在这里找到了正确答案的帮助:https://stackoverflow.com/a/12526286/50394

但它正在谈论在Google Apps上设置客户端API范围,而我没有使用Google Apps,我只是使用Google App Engine的域foo.appspot.com

5 个答案:

答案 0 :(得分:6)

您获得的403错误意味着您的GET中没有授权标头。逻辑是没有授权标题,你是匿名的(你是军团等等等等):-))。匿名使用的Drive配额为零,因此消息。 URL缩短器具有较高的匿名配额,因此可以正常工作。

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

答案 1 :(得分:1)

AFAICT您应该在授权标头中使用Bearer

可能发生的事情是,Drive API无法识别服务帐户(因为标题错误?)因此将其作为匿名请求,因为没有提供key参数(请参阅{{ 3}})。

试试这个:

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

或者您可以尝试将令牌添加为access_token查询参数。

答案 2 :(得分:1)

我认为您至少应该在https://code.google.com/apis/console处设置启用了Drive API的API控制台条目 创建此项后,您将获得可在GoogleCredential对象中使用的ID。从GoogleCredential对象中,您可以获得访问令牌,您可以将其添加到请求中。

答案 3 :(得分:1)

我在这里阅读的内容(Google drive via service accounts)是您使用稍微不同的样式,使用从开发者控制台检索的API KEY。
对我来说相关的部分是生成“服务器应用程序的密钥”,然后使用这种技术,我没有读过其他地方

      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();

答案 4 :(得分:0)

answer声称:

  

Drive SDK不支持服务帐户   安全模型。

如果仍然如此,一种解决方法是使用常规Google帐户执行常规OAuth舞蹈,并在数据存储区中保留访问权限和刷新令牌。