2013-05-21 36 views
18

Tôi đang cố gắng thực hiện xác thực HTTP cơ bản bằng mã bên dưới, nhưng nó đang phát ra lỗi sau:Xác thực HTTP cơ bản trong Go

2013/05/21 10:22:58 Lấy mydomain.com: lược đồ giao thức không được hỗ trợ "" trạng thái thoát 1

func basicAuth() string { 
    var username string = "foo" 
    var passwd string = "bar" 
    client := &http.Client{} 
    req, err := http.NewRequest("GET", "mydomain.com", 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 
} 

Bất kỳ ý tưởng nào tôi có thể làm sai?

Trả lời

20

Bạn cần chỉ định giao thức cho NewRequest, ví dụ: "http: //", xem here.

req, err := http.NewRequest("GET", "http://mydomain.com", nil) 
17

tiềm năng 'gotcha' là nếu trang web của bạn thực hiện bất kỳ chuyển hướng nào ... Go-lang sẽ thả tiêu đề được chỉ định của bạn trên chuyển hướng. (Tôi phải làm việc này để tìm hiểu điều này! Bạn có thể nhanh chóng tìm hiểu bằng chrome bằng cách nhấp chuột phải vào "kiểm tra phần tử" và nhấp vào tab mạng)

bạn sẽ muốn xác định chức năng chuyển hướng thêm tiêu đề trở lại .

func basicAuth(username, password string) string { 
    auth := username + ":" + password 
    return base64.StdEncoding.EncodeToString([]byte(auth)) 
} 

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

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) 
} 
+7

Mẹo rất hữu ích - tự chạy cùng một vấn đề. Trong hàm chuyển hướng, bạn có thể thực hiện 'req.SetBasicAuth (" username1 "," password123 ")' thay vì đặt chính tiêu đề. – mjturner

Các vấn đề liên quan