【发布时间】:2021-12-24 02:20:06
【问题描述】:
我在 Cloud Run 上托管了 Grafana。 Grafana 已启用匿名访问,而 Cloud Run 需要有效凭据。
现在我试着模仿https://grafana.com/docs/grafana/latest/http_api/dashboard/ 的第一个例子。因此,我将服务帐户密钥下载到/tmp/creds.json。这个文件我设置为GOOGLE_APPLICATION_CREDENTIALS。
然后使用这些凭据向/api/dashboards/db 发送一个POST。
我看到的是我通过了 Google 身份验证,它启动了 Cloud Run 实例,我从 Grafana 收到一条错误消息:
{"message":"invalid API key"}
这反过来又让我相信 Google 身份验证没有使用 Authorization 标头,而是将其委托给它。
所以我的问题是如何防止 Google 身份验证委托此标头? 或者作为一种解决方法,我怎样才能让 Grafana 忽略标题?
这里是我用来提出请求的来源:
func TestCall(t *testing.T) {
r := strings.NewReader(`
{
"dashboard": {
"id": null,
"uid": null,
"title": "Production Overview",
"tags": [ "templated" ],
"timezone": "browser",
"schemaVersion": 16,
"version": 0,
"refresh": "25s"
},
"folderId": 0,
"folderUid": "l3KqBxCMz",
"message": "Made changes to xyz",
"overwrite": false
}
`)
os.Setenv("GOOGLE_APPLICATION_CREDENTIALS", "/tmp/creds.json")
ctx := context.TODO()
ts, err := idtoken.NewTokenSource(ctx, "https://grafana-123.run.app")
if err != nil {
if !strings.HasPrefix(err.Error(), "idtoken: credential must be service_account") {
panic(err)
}
creds, err := google.FindDefaultCredentials(ctx)
if err != nil {
panic(err)
}
ts = creds.TokenSource
}
tok, err := ts.Token()
if err != nil {
panic(err)
}
if tok.AccessToken == "" {
panic("Empty token!")
}
fmt.Printf("AT %s\n", tok.AccessToken)
client := &http.Client{}
req, err := http.NewRequest("POST", "https://grafana-123.run.app/api/dashboards/db", r)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+tok.AccessToken)
// This does not work at all: req.Header.Set("Proxy-Authorization", "Bearer "+tok.AccessToken)
req.Header.Set("Content-Type", "application/json")
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
fmt.Printf("SC %d\n", resp.StatusCode)
bs, err := io.ReadAll(resp.Body)
if err != nil {
panic(err)
}
panic(string(bs))
}
}
【问题讨论】:
-
我想知道你是否可以在grafana中设置基于oidc的访问,以google作为身份提供者,然后将用户的身份暴露给grafana。 grafana.com/docs/grafana/latest/auth/google
-
我在 OIDC 和多层身份验证/反向代理/负载均衡器方面的经验是,您需要非常了解每一个部分才能使其正常工作。我不是;)
标签: go google-cloud-run