我们已经在GKE集群中成功地使用Google Sheets的Java客户端一段时间了,使用ComputeCredential
类来提供凭据。下面的代码或多或少就是我们正在做的:
import com.google.api.client.googleapis.compute.ComputeCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.sheets.v4.Sheets;
NetHttpTransport transport = GoogleNetHttpTransport.newTrustedTransport();
GsonFactory jsonFactory = GsonFactory.getDefaultInstance();
ComputeCredential credential = new ComputeCredential(transport, jsonFactory);
Sheets service = new Sheets.Builder(transport, jsonFactory, credential)
.setApplicationName("myApplication")
.build();
我们最近在我们的集群上启用了Workload Identity,这个集成不再工作——我们得到一个403,消息是ACCESS_TOKEN_SCOPE_INSUFFICIENT
。我认为这是因为默认作用域包含Google Cloud api,不允许您指定所需的Google Sheets作用域。
我在Google -auth-library-oauth2-http中找到了ComputeEngineCredentials
类,它允许传入范围,但与Google Sheets库不兼容。
我已经提出了一个GitHub问题,但还没有回复。
有没有人知道如何使用工作负载身份的谷歌表库?
oAuth2流程需要用户交互-为服务器端使用服务帐户。
我终于想出了解决办法!对于其他想知道的人,您可以编辑ComputeCredential对象上的令牌服务器URL以包含范围,如下所示:
import com.google.api.client.googleapis.compute.ComputeCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.sheets.v4.Sheets;
NetHttpTransport transport = GoogleNetHttpTransport.newTrustedTransport();
GsonFactory jsonFactory = GsonFactory.getDefaultInstance();
ComputeCredential.Builder builder = new ComputeCredential.Builder(transport, jsonFactory);
GenericUrl url = builder.getTokenServerUrl().clone().set("scopes", "<your scopes here>");
ComputeCredential credential = builder.setTokenServerUrl(url).build();
Sheets service = new Sheets.Builder(transport, jsonFactory, credential)
.setApplicationName("myApplication")
.build();