激怒Google API客户端(Java)问题

时间:2018-05-27 19:01:51

标签: java google-app-engine google-sheets google-sheets-api google-api-java-client

所以我正在做的事情要求我用google sheet api打一个文件,拿一张纸,从中提取数据,然后生成另一张纸。所以最初我使用服务帐户的示例如下:

@Bean(name = "google-creds")
@DependsOn(value = {"google-http-transport", "google-data-store", "json-factory"})
public GoogleCredential authorize(HttpTransport transport, JsonFactory factory) throws Exception {
    // Load client secrets.
    InputStream in = new FileInputStream(new File("config/oauth.json"));
    return GoogleCredential.fromStream(in, transport, factory).createScoped(SCOPES);
}

我的oauth.json文件正在使用API​​控制台凭据选项卡中生成的json文件。我按照指示生成了一个服务帐户...我有点怀疑。

我能够从我想要的文档中提取数据,并且我能够创建另一个文档。但是据我所知,没有办法查看使用服务帐户创建的文档。哪个......我的意思是说它完全无用。如果有办法我可以从主帐户查看这些文档,那么创建服务帐户就会非常棒。一些谷歌的答案似乎暗示这是不可能的。

好吧我决定尝试使用主帐户中的客户端ID。我下载提供的json文件和...它的错误并说出未知字段'type'。所以..我猜它是使用gson或其他东西的RuntimeTypeAdapter序列化的。因此,它与主帐户的凭证格式完全不兼容。

接下来我试着这样做

    @Bean(name = "google-creds")
    @DependsOn(value = {"google-http-transport", "google-data-store"})
    public Credential authorize(HttpTransport transport) throws Exception {
        // Load client secrets.
        InputStream in = new FileInputStream(new File("config/oauthnew.json"));
        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JacksonFactory.getDefaultInstance(), new InputStreamReader(in));
        GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(transport, factory, clientSecrets, SCOPES)
                .setDataStoreFactory(new MemoryDataStoreFactory()).build();
        Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
        return credential;
    }

所以我没有真正读过这篇文章,事实证明它创建了一个本地码头服务器......出于某种莫名其妙的原因。它还要求我访问一个URL然后婊子重定向。我不希望任何重定向,或者...解析和制作一个该死的电子表格之外的任何东西。如果URL要求帐户已经过身份验证,那么访问URL已经是一个交易破坏者。这需要每10分钟左右以编程方式运行一次。

此外,当我使用上面的示例时,我找不到任何地方以任何形式或形式配置共享或权限。 Google通常拥有良好的API,但这是我在近十年的Java开发中使用过的最令人烦恼的API。我只需要能够A)解析表A B)必要时创建表B和C)能够查看表B

有人能指出我没有让我在我的显示器上尖叫的方向吗?

1 个答案:

答案 0 :(得分:0)

服务帐户用于以编程方式访问用户日期,并且没有自己的文档/驱动器。创建GoogleCredential时,您需要提供用户的电子邮件地址。服务帐户将比访问所需的用户文档要多(请确保已启用域范围委派)。 GoogleStreams的GoogleCredentials当前存在一个未解决的问题,请看一看(解决)https://github.com/google/google-api-java-client/issues/1007#issuecomment-318493967

如果用户帐户是gsuite帐户,则可以通过Google管理控制台https://admin.google.com/

授予服务帐户对范围的权限

有关域范围授权和授予访问权限的详细信息,请查看https://developers.google.com/admin-sdk/directory/v1/guides/delegation

要使用域范围内的委派查看由服务帐户创建的文档,您将必须使用用户帐户来访问它。

现在,如果您可以使用Google管理控制台授予访问权限的帐户,则必须使用该流程(第二种方法)。不幸的是,这将要求您必须通过提供的URL授予对文档的权限。授予权限后,您可以存储令牌,这样就无需重复此过程。