使用AppIdentityService对

时间:2015-05-29 16:07:51

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

我可以使用AppIdentityService成功验证我的应用引擎应用。但是,当我执行SpreadsheetService.getEntries时,我没有收到任何条目。

这是我的代码:

SpreadsheetService service = new SpreadsheetService("Spreadsheet editing");
String[] SCOPESArray = { "https://spreadsheets.google.com/feeds" };
final List SCOPES = Arrays.asList(SCOPESArray);
AppIdentityService appIdentity = AppIdentityServiceFactory.getAppIdentityService();
AppIdentityService.GetAccessTokenResult accessToken = appIdentity.getAccessToken(SCOPES);

Credential creds = new Credential(BearerToken.authorizationHeaderAccessMethod());
creds.setAccessToken(accessToken.getAccessToken());    
service.setOAuth2Credentials(creds);

SpreadsheetFeed feed = service.getFeed(new URL("https://spreadsheets.google.com/feeds/spreadsheets/private/full"), SpreadsheetFeed.class);

List spreadsheets = feed.getEntries();

此时,电子表格是一个空列表。

我已通过在电子表格中输入服务帐户电子邮件与我的应用共享电子表格"分享"框 - 这是表单中的电子邮件:xxx@developer.gserviceaccount.com

我在这里误解了权限吗?是"分享"一个电子表格,其服务帐户不足以制作服务帐户"请参阅"电子表格?

2 个答案:

答案 0 :(得分:0)

我发现共享在Google文档上效果不佳,即“与我共享”文件夹相当不完整。这似乎与Drive有所改进,但Spreadsheet API很古老......

我所做的是与App Engine服务帐户共享包含电子表格的文件夹,并使用Drive API列出这些文件夹中的电子表格。使用密钥访问文件夹。这允许我为单元测试,测试和生产配置不同的文件夹。

以下是从文件夹中获取电子表格的示例代码:

public enum MimeType { //
  SPREADSHEET ("application/vnd.google-apps.spreadsheet"),
  EXCEL ("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

  private String type;
  MimeType(String type) {this.type = type;}

  public String getType() {
    return type;
  }
}

/**
 * Get a list of files of a given type from a folder 
 * 
 * @param folderId The Id of the folder
 * @param type The mime type of the files
 * @return a {@link FileList} containing the desired files
 * @throws IOException
 */
public FileList getFolderItems(String folderId, MimeType type) throws IOException {
    QueryBuilder query = new QueryBuilder();
    query.addParent(folderId).setMimeType(type);
    FileList list = drive.files().list().setQ(query.getQuery()).execute();
    return list;
}

然后,您可以使用File.getId()检索要与电子表格API一起使用的文件密钥。

另外,我建议不要使用App Engine中的电子表格API。从GAE调用时,API会不断遇到超时和其他异常。我不得不将我的处理转移到一个排队的任务,遗憾的是,它没有承诺的更长的URLFetch超时(参见issue 10470),但至少,请求没有被取消。

我编写了大多数Spreadsheet API调用的包装器,以便在获得异常时重试调用。我不断添加更多包装纸。

答案 1 :(得分:0)

目前,我认为使用Google App Engine中的Sheets API进行更新时,不支持AppIdentity

似乎可以进行身份​​验证,但SpreadsheetEntry的列表始终为空。

而是通过在GoogleCredential实例中指定凭据来使用Google App Engine中的服务帐户:

GoogleCredential creds = new GoogleCredential.Builder()
    .setTransport(GoogleNetHttpTransport.newTrustedTransport())
    .setJsonFactory(JacksonFactory.getDefaultInstance())
    .setServiceAccountId(serviceAccountEmailAddress)
    .setServiceAccountPrivateKeyFromP12File(p12FileFromCredentials)
    .setServiceAccountScopes(SCOPES)
    .build();


service.setOAuth2Credentials(creds);