簡體   English   中英

防止 Cloud Run 傳遞 Authorization 標頭

[英]Prevent Cloud Run from passing on Authorization header

我在 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 auth 不會使用Authorization標頭,而是將其委托。

所以我的問題是如何防止 Google auth 委托此標頭? 或者作為一種解決方法,我怎樣才能讓 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))
    }
}

標題 Proxy-Authorization 應該可以工作,但我也沒有成功。

為了澄清您的問題,您正在使用 IAP(OIDC 身份令牌)來授權對 Cloud Run 的訪問。 您的軟件 (Grafana) 正在處理 HTTP Authorization 標頭並假設您向它傳遞 API 密鑰(失敗)。 我不熟悉 Grafana 內部結構,但一種可能的解決方案是編寫檢測 OIDC 令牌並刪除該標頭的中間件。 我不知道從您的應用程序收到的 HTTP 請求中刪除授權標頭的 Cloud Run 方法。

恕我直言,這是一個應該在 Grafana 代碼中解決的問題。 如果 Grafana 啟用了匿名訪問,則它不應驗證 HTTP 授權標頭。 考慮打開 Grafana 的問題或修復代碼並提交補丁。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM