如何将请求中的服务帐户令牌发送到 Google Cloud Functions

How to send service account token in request to Google Cloud Functions

我是 运行 Google Cloud Functions 中更新 DNS 记录的简单函数 (see code here)。目前,我创建了具有 roles/dns.admin 权限的服务帐户并将其分配给函数。然后我依赖 Functions 对客户端身份验证和授权的测试版支持。

替代方法可能是不为函数提供服务帐户凭据(roles/dns.admin),而是在每个请求中传递凭据。

我如何使用 Go 运行时执行此操作 - 我如何使用 Google API Go 客户端请求中的不记名令牌?

Pros/cons这两种方法?

在GCF中,您可以请求这个来获取令牌。

curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" -H "Metadata-Flavor: Google"

参考:https://cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances#applications

Cloud Function 应该能够使用其凭据通过获取默认凭据并将其传递到 DNS 客户端来授权请求​​。

在此处查找更多信息:Setting Up Authentication for Server to Server Production Applications

我找到了一种方法,可以将源自请求的访问令牌提供给 Google API Go 客户端。下面是我构造客户端的方式(r是传入的http.Request):

ctx := context.Background()

auth := r.Header.Get("Authorization")
token := strings.TrimPrefix(auth, "Bearer ")
ts := oauth2.StaticTokenSource(
    &oauth2.Token{AccessToken: token},
)
c := oauth2.NewClient(ctx, ts)

dnsService, err := dns.New(c)

但经过一番思考,我认为这对我来说不是一个好方法:访问令牌对于提供给请求者来说是不必要的强大。所以我在原来的问题中选择了第一种方法。