当前位置: 首页 > 知识库问答 >
问题:

使用Google SheetsJavaAPI与API密钥不是OAuth?

严安志
2023-03-14

有没有一种方法可以使用带有API键的“GoogleSheetJavaAPI”,而不是示例中给出的OAuth

https://developers.google.com/sheets/api/quickstart/java

我知道您可以使用HTTP请求通过API键获取数据,但我在想,是否有一种方法可以使用google提供的Java API来实现这一点,这样我就不必为每个请求解析JSON。

共有3个答案

卫彭亮
2023-03-14

您还可以使用以下代码

Sheets service = new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
                .setApplicationName(APPLICATION_NAME)
                .setGoogleClientRequestInitializer(CommonGoogleClientRequestInitializer.newBuilder().setKey(API_KEY).build())
                .build();
范哲
2023-03-14

是的,你可以,基本上你需要以下东西:

public NetHttpTransport netHttpTransport() throws GeneralSecurityException, IOException {
    return GoogleNetHttpTransport.newTrustedTransport();
}

public JacksonFactory jacksonFactory() {
    return JacksonFactory.getDefaultInstance();
}

private Set<String> googleOAuth2Scopes() {
    Set<String> googleOAuth2Scopes = new HashSet<>();
    googleOAuth2Scopes.add(SheetsScopes.SPREADSHEETS_READONLY);
    return Collections.unmodifiableSet(googleOAuth2Scopes);
}

public GoogleCredential googleCredential() throws IOException {
    File serviceAccount = new ClassPathResource("serviceAccount.json").getFile();
    return GoogleCredential.fromStream(new FileInputStream(serviceAccount))
            .createScoped(googleOAuth2Scopes());
}

public Sheets googleSheets() {
    return new Sheets(netHttpTransport(), jacksonFactory(), googleCredential());
}

您可以阅读更多关于serviceAccount.json这里:https://cloud.google.com/iam/docs/creating-managing-service-account-keys

以上内容摘自我与谷歌API集成的Spring Boot项目示例:https://github.com/ciscoo/spring-boot-google-apis-example

司浩壤
2023-03-14

我没有找到任何官方的方法来实现这一点,但我能够做到这一点,如获取和使用API密钥中所述:

拥有API密钥后,应用程序可以将查询参数key=yourAPIKey附加到所有请求URL。

通过使用请求拦截器并手动添加key查询参数,如下所示:

private Sheets getSheets() {
    NetHttpTransport transport = new NetHttpTransport.Builder().build();
    JacksonFactory jsonFactory = JacksonFactory.getDefaultInstance();
    HttpRequestInitializer httpRequestInitializer = request -> {
        request.setInterceptor(intercepted -> intercepted.getUrl().set("key", API_KEY));
    };

    return new Sheets.Builder(transport, jsonFactory, httpRequestInitializer)
            .setApplicationName(APPLICATION_NAME)
            .build();
}

public List<List<Object>> getValues(String spreadsheetId, String range) throws IOException {
    return getSheets()
            .spreadsheets()
            .values()
            .get(spreadsheetId, range)
            .execute()
            .getValues();
}
 类似资料:
  • Swagger支持api密钥的安全性,但这似乎仅限于单个参数。 有没有办法定义一组参数(key和secret)作为请求中的参数? 或者,唯一的方法就是跳过安全方案,只将这些参数添加到每个请求中?

  • 我得到异常“http://api.openweathermap.org/data/2.5/weather?q=sydney”。有人能帮忙怎么用吗。当我粘贴以下内容时,可以很好地使用web浏览器 我也试过下面的组合,但没有运气

  • 我遇到了很多文章,很多文章建议使用OAuth over API密钥。据我所知,在OAuth中,我们最终获得了访问令牌,它的有效期为很多天。例如,QuickBooks online OAuth令牌的有效期为6个月。 因此,访问令牌等同于API Key。无论谁得到它,都应该像API密钥一样保护它。OAuth调用应该通过HTTPS进行,类似于基于API Key的调用。 相对于OAuth的另一个优势是授权

  • 在AWS Xamarin SDK文档中,的Amazon Cognito Identity API文档在其第二段中指出,“必须使用AWS开发人员凭据来调用此API。” 现在,总的想法是尽量不要泄露API机密 但是上面粗体提到的这段文字是否意味着我不能使用IAM角色和/或策略来调用这些API?这是否意味着我必须在应用程序源代码中包含accessKey和secretKey? AWS提供了Cognito机

  • 我想保护Spring Boot API,使它只对具有有效API密钥和秘密的客户机是可访问的。但是,由于所有数据都是匿名的,程序内部没有身份验证(使用用户名和密码的标准登录)。我试图实现的只是所有API请求都可以仅用于特定的第三方前端。