Verbesserung der Authentifizierungsbehandlung für HTTP-Abfragen in Go
Problem:
Bedenken Sie den folgenden Code zum Durchführen von HTTP-Anfragen mit Authentifizierung:
client := &http.Client{} // Authenticate req, err := http.NewRequest("GET", "http://164.99.113.32/Authenticate", nil) req.SetBasicAuth("<username>", "<password>") resp, err := client.Do(req) if err != nil { fmt.Printf("Error : %s", err) } // Get Details req.URL, _ = url.Parse("http://164.99.113.32/Details") resp, err = client.Do(req) if err != nil { fmt.Printf("Error : %s", err) }
Nach erfolgreicher Authentifizierung schlägt die nachfolgende Anfrage an „/Details“ mit der Fehlermeldung 401 „Zugriff verweigert“ fehl, obwohl auf der Serverseite kein Problem vorliegt.
Lösung:
Um dieses Problem zu beheben, ist es notwendig, eine Cookie-Dose zu verwenden, um Sitzungsinformationen zu verwalten. Der HTTP-Client von Go verarbeitet dies standardmäßig nicht, daher müssen wir unsere benutzerdefinierte Cookie-Jar-Implementierung definieren:
type myjar struct { jar map[string] []*http.Cookie } func (p* myjar) SetCookies(u *url.URL, cookies []*http.Cookie) { fmt.Printf("The URL is : %s\n", u.String()) fmt.Printf("The cookie being set is : %s\n", cookies) p.jar [u.Host] = cookies } func (p *myjar) Cookies(u *url.URL) []*http.Cookie { fmt.Printf("The URL is : %s\n", u.String()) fmt.Printf("Cookie being returned is : %s\n", p.jar[u.Host]) return p.jar[u.Host] }
Initialisieren Sie in der Hauptfunktion die benutzerdefinierte Cookie-Jar und weisen Sie sie dem HTTP-Client zu:
jar := &myjar{} jar.jar = make(map[string] []*http.Cookie) client.Jar = jar
Mit dieser Implementierung kann die nachfolgende Anfrage erfolgreich auf den Endpunkt „/Details“ zugreifen.
Das obige ist der detaillierte Inhalt vonWie gehe ich mit Authentifizierungscookies für HTTP-Anfragen in Go um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!