首頁  >  文章  >  後端開發  >  為什麼 Go 中發生重定向時基本 HTTP 認證會失敗?

為什麼 Go 中發生重定向時基本 HTTP 認證會失敗?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-21 04:46:17328瀏覽

Why Does Basic HTTP Authentication Fail in Go When Redirects Occur?

Go 中的基本HTTP 驗證處理

在Go 中實現基本HTTP 驗證時,可能會出現一些意想不到的挑戰。本文深入探討了嘗試實作基本 HTTP 驗證時遇到的常見問題。

問題:執行以下程式碼時遇到「不支援的協定方案」錯誤:

func basicAuth() string {
    var username string = "foo"
    var passwd string = "bar"
    client := &http.Client{}
    req, err := http.NewRequest("GET", "mydomain.example", nil)
    req.SetBasicAuth(username, passwd)
    resp, err := client.Do(req)
    if err != nil{
        log.Fatal(err)
    }
    bodyText, err := ioutil.ReadAll(resp.Body)
    s := string(bodyText)
    return s
}

原因:當發生重新導向時,Go-lang 會丟棄任何指定的標頭,包括為基本驗證設定的Authorization 標頭。

解決方案:修正針對這個問題,可以實作一個自訂的重定向策略函數:

func redirectPolicyFunc(req *http.Request, via []*http.Request) error {
    req.Header.Add("Authorization", "Basic "+basicAuth("username1", "password123"))
    return nil
}

此函數確保在重定向期間加回Authorization標頭,有效保留身分驗證憑證。

實作:

func main() {
    client := &http.Client{
        Jar: cookieJar,
        CheckRedirect: redirectPolicyFunc,
    }
    req, err := http.NewRequest("GET", "http://localhost/", nil)
    req.Header.Add("Authorization", "Basic "+basicAuth("username1", "password123")) 
    resp, err := client.Do(req)
}

透過利用重定向策略功能,指定的標頭(包括用於基本驗證的授權標頭)將在整個重定向過程中持續存在,確保與目標伺服器成功進行身份驗證。

以上是為什麼 Go 中發生重定向時基本 HTTP 認證會失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn