有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用AppIdentityService进行身份验证时未找到电子表格

我可以使用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) 个答案

  1. # 1 楼答案

    目前,我认为在使用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);
    
  2. # 2 楼答案

    我发现谷歌文档上的共享效果不太好,即“与我共享”文件夹相当不完整。这似乎已经改善了驱动器,但电子表格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时,API经常会遇到超时和其他异常。我不得不将处理转移到一个排队的任务中,不幸的是,该任务没有承诺的更长的URLFetch超时时间(请参见issue 10470),但至少请求没有被取消

    我编写了大多数电子表格API调用的包装器,以便在出现异常时重试调用。我不断地添加更多的包装