authentication - 无法使用 Golang 使用服务帐户凭据访问 Google 电子表格
问题描述
我正在编写一个 AWS Lambda 代码,用于使用 Golang 访问和更新以 URL 作为输入的电子表格。到目前为止,我可以按照 Google 指南使用 OAuth 客户端 ID 在本地访问电子表格 - https://developers.google.com/sheets/api/quickstart/go
但由于我想从 AWS Lambda 运行代码,我想使用 Google 服务帐户执行身份验证。我创建了一个服务帐户并收到了包含以下信息的凭据。
{
"type": "service_account",
"project_id": "quickstart-1XXXXXXX806",
"private_key_id": "a1XXXXXXXXXXXXXXXXXXXXX3c3e5d8e",
"private_key": "-----BEGIN PRIVATE KEY-----\nMZ4C8......\nD\n-----END PRIVATE KEY-----\n",
"client_email": "lambda@quickstart-1XXXXXXX806.iam.gserviceaccount.com",
"client_id": "1XXXXXXXXXXXXXXXXX2",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/lambda%40quickstart-1573627656806.iam.gserviceaccount.com"
}
我已经阅读了很多文档,但我没有找到任何使用 Golang 代码使用 Google 服务帐户访问 Google 电子表格的参考资料。每个文档都参考以下 Github 链接 - https://github.com/googleapis/google-api-go-client 但是由于我最近开始使用 Golang,我真的不明白如何实现它。阅读 Google 指南后,我了解服务帐户所需的流程如下 -
但是我仍然无法为此编写 Golang 代码。如果有人可以分享一些参考资料,我将不胜感激:)
解决方案
@ZektorH 的回答帮助我完成了这段代码。下面是使用服务帐户从 Google 电子表格中提取数据的完整工作示例。
package main
import (
"fmt"
"log"
"golang.org/x/oauth2"
"golang.org/x/oauth2/jwt"
"google.golang.org/api/sheets/v4"
)
func main() {
// Create a JWT configurations object for the Google service account
conf := &jwt.Config{
Email: "lambda@quickstart-XXXXXXXXXX.iam.gserviceaccount.com",
PrivateKey: []byte("-----BEGIN PRIVATE KEY-----\nxxxxxx\n-----END PRIVATE KEY-----\n"),
PrivateKeyID: "a1a6xxxxxxxxxxxxxxxxxxxxxxxe5d8e",
TokenURL: "https://oauth2.googleapis.com/token",
Scopes: []string{
"https://www.googleapis.com/auth/spreadsheets.readonly",
},
}
client := conf.Client(oauth2.NoContext)
// Create a service object for Google sheets
srv, err := sheets.New(client)
if err != nil {
log.Fatalf("Unable to retrieve Sheets client: %v", err)
}
// Change the Spreadsheet Id with yours
spreadsheetId := "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms"
// Define the Sheet Name and fields to select
readRange := "Sheet1!A2:B"
// Pull the data from the sheet
resp, err := srv.Spreadsheets.Values.Get(spreadsheetId, readRange).Do()
if err != nil {
log.Fatalf("Unable to retrieve data from sheet: %v", err)
}
// Display pulled data
if len(resp.Values) == 0 {
fmt.Println("No data found.")
} else {
fmt.Println("Name, Major:")
for _, row := range resp.Values {
fmt.Printf("%s, %s\n", row[0], row[1])
}
}
}
另外,请注意,如果您收到如下错误:
googleapi: 错误 403: 调用者没有权限,禁止
那么您可能没有授予您的 google 帐户访问该电子表格的权限。如果是这样的话-
只需在浏览器中转到您要与之交互的 Google 工作表即可。
转到屏幕右上角的共享。
- 转到高级设置并与您的服务帐户前的电子邮件地址共享。lambda@quickstart-XXXXXXXXXX.iam.gserviceaccount.com
推荐阅读
- julia - 如何训练神经 ODE 来预测 Julia 中的 Lotka Voltera 时间序列?
- java - 我正在尝试比较 For 循环中的两个数组
- swift - 如何生成 JWT 以用于 Swift 应用程序的 API 身份验证
- python - 获取 Pandas 中每个组的列中包含特定值的行
- r - 在数据框中定义分位数组,数据源在 R 中的另一个数据框中
- sql-server - 使用 CSV 数据提取表字段
- python - 将辅助变量传递给数据类 __init__ 而不分配它们
- r - 从适合 purrr 的模型中提取残差
- r - 如何生成包含多个不同长度(行)的个体的样本时间序列数据集?
- elasticsearch - 停止启动具有所有主分片的弹性搜索实例