gpt4 book ai didi

google-oauth - 可以使用 GKE Workload Identity 访问 Google 表格吗?

转载 作者:行者123 更新时间:2023-12-04 12:02:45 31 4
gpt4 key购买 nike

我目前正在使用 GKE Workload Identity从 GKE 中访问 Google Cloud Platform 资源。这对于 Google Cloud Storage 和其他平台资源非常有效。

但是,当我尝试使用 GKE Workload Identity 访问 Google Sheet 时,我遇到了“身份验证范围不足”的问题。

当我为服务帐户生成 key 文件并在我的代码中使用它时,我可以手动将范围设置为 https://www.googleapis.com/auth/spreadsheets .它按预期工作,我可以访问工作表。如果我将范围更改为 https://www.googleapis.com/auth/cloud-platform ,我遇到了与 GKE Workload Identity 相同的错误,“身份验证范围不足”。此结果表明服务帐号运行良好,因此问题似乎与分配给 GKE Workload Identity 的范围有关。

使用 GKE Workload Identity,我在 Python 中使用 credentials = google.auth.default() 检索凭据[1]。 credentials对象具有预期的服务帐户,范围设置为 https://www.googleapis.com/auth/cloud-platform .我现在可以访问服务帐户有权访问的存储桶和其他云资源。但是,Google 表格似乎需要 https://www.googleapis.com/auth/spreadsheets范围,但我还没有找到任何方法来设置它。从 GKE 集群中运行的 GKE 元数据服务器检索工作负载身份(服务帐号)和范围。据我所知,GKE 工作负载身份的范围似乎“硬编码”到 https://www.googleapis.com/auth/cloud-platform .我没有找到有关是否可以更改的信息。

(我尝试将电子表格范围添加到 GKE 节点 oauth 范围。没有效果。从我从文档中可以理解的内容来看,它应该是无关的。)

(当然,我可以只使用 key 文件来完成这项工作,但 GKE Workload 身份的全部意义正是为了避免安全生成和分发 key 的所有麻烦)

[1] User Guide — google-auth 1.6.2 documentation

最佳答案

来自 google-auth指南,您是否像这样设置电子表格范围?

credentials, project = google.auth.default(
scopes=['https://www.googleapis.com/auth/spreadsheets'])

我在使用默认客户端时看到了一些相同的行为,但是在使用 curl 进行测试时,我确实使用 Workload Identity 取得了一些成功。
我们可以使用 curl 执行流程在测试 pod 上(例如部署一个 ubuntu pod 并安装 curl)。您应该能够在 GKE pod 上通过 curl gke-metadata-server 来验证作用域 token 是否如您所愿:
$ curl -H "Metadata-Flavor: Google" http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token?scopes=https%3A//www.googleapis.com/auth/spreadsheets%20
然后我们可以像这样使用在请求中返回给sheets API 的 token ,假设我们已经设置了 ACCESS_TOKENSPREADSHEET_ID环境变量:
$ curl -X GET -H "Authorization: Bearer $ACCESS_TOKEN" https://sheets.googleapis.com/v4/spreadsheets/$SPREADSHEET_ID
这将返回有关您的工作表的所有信息,而不是 403 错误。
我相信这是客户端库应该在幕后做的事情,但这里可能存在一些错误。

这是一个在 GKE pod 上运行的 go 应用程序的工作示例,其中配置了 Workload Identity(服务帐户已被授予查看表 ID 的访问权限)。 go.mod
module example.com/m

go 1.13

require (
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c
google.golang.org/api v0.48.0
)
main.go :
package main

import (
"fmt"
"golang.org/x/oauth2"
"golang.org/x/oauth2/google"
"google.golang.org/api/sheets/v4"
)

func main() {
client, err := google.DefaultClient(oauth2.NoContext, sheets.SpreadsheetsScope)
if err != nil {
panic(err)
}
srv, err := sheets.New(client)
if err != nil {
panic(err)
}
resp, err := srv.Spreadsheets.Values.Get("REPLACE_WITH_YOUR_SHEET_ID", "REPLACE_WITH_YOUR_RANGE").Do()
if err != nil {
panic(err)
}
fmt.Println(fmt.Sprintf("%+v", resp.Values))
}

FWIW 我注意到使用旧版本的 oauth2 库绝对不适用于工作负载标识和范围。更新以使用较新版本解决了该问题。

关于google-oauth - 可以使用 GKE Workload Identity 访问 Google 表格吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61238762/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com