使用服务帐户

时间:2018-02-09 17:31:27

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

我正在尝试创建频道,以便在Google电子表格上进行修改时接收推送通知。代码将在App Engine Standard Java8项目上执行。

因为一个频道最长可以持续24小时,所以我创建了一个每天都会更新频道的cron。

这是我的配置:

  • 我创建了一个服务帐户:xxxx@yyyy.iam.gserviceaccount.com
  • 我验证了域:yyyy.appspot.comWebmaster Tools
  • 我将域名添加到云端控制台(第API & Services -> Domain Verification部分)
  • 我创建了一个处理推送通知的端点:https://yyyy.appspot.com/api/drive/push
  • sheetId为:foo_bar(由电子表格浏览器网址复制,如https://docs.google.com/spreadsheets/d/foo_bar/edit
  • 服务帐户在工作表
  • 上为Can Edit

使用Java库google-api-services-drive:v3-rev102-1.23.0我创建了这段代码

public static void main(String[] args) throws IOException {
    String spreadsheetId = "foo_bar";
    InputStream json = GoogleDriveApi.class.getClassLoader().getResourceAsStream("bar.json");

    GoogleCredential credential = GoogleCredential.fromStream(json, new NetHttpTransport(), new JacksonFactory());
    if (credential.createScopedRequired()) {
        credential = credential.createScoped(Collections.singleton("https://www.googleapis.com/auth/drive.appdata"));
    }

    Drive service = new Drive.Builder(new NetHttpTransport(), new JacksonFactory(), credential).build();

    Channel channel = new Channel();
    channel.setAddress("https://example.com/api/drive/push");
    channel.setType("web_hook");
    channel.setId(UUID.randomUUID().toString());

    Watch action = service.files().watch(spreadsheetId, channel);
    System.out.println(action.execute().toPrettyString());
}

当我执行此代码时,我收到此错误:

com.google.api.client.googleapis.json.GoogleJsonResponseException: 404 Not Found
{
  "code" : 404,
  "errors" : [ {
    "domain" : "global",
    "location" : "fileId",
    "locationType" : "parameter",
    "message" : "File not found: foo_bar.",
    "reason" : "notFound"
  } ],
  "message" : "File not found: foo_bar."
}

来自documentation我引用

  

每个通知渠道都与特定用户相关联   和特定资源(或资源集)。观看请求会   除非当前用户或服务帐户拥有或,否则不会成功   有权访问此资源

在我的情况下,服务帐户不会拥有资源(电子表格),但确实拥有该权限(Can Edit权限,仅限Can View

是否可以使用服务帐户在Google云端硬盘上创建频道?

1 个答案:

答案 0 :(得分:1)

file.watch API需要insert范围,在我仅使用https://www.googleapis.com/auth/drive的主要示例中

使用以下行,该示例正常工作

https://www.googleapis.com/auth/drive.appdata