Google is committed to advancing racial equity for Black communities. See how.

Jak radzić sobie z przekierowaniami

Niektóre języki programowania mają implementacje HTTP, które wymagają specjalnej obsługi przekierowań.

W odpowiedzi na żądanie REST API serwer Nest API zwraca przekierowanie. Klient REST wykrywa przekierowanie i żąda strony, do której klient został przekierowany. Niektóre implementacje HTTP nie przekazują nagłówka Authorization do przekierowanego identyfikatora URI, co powoduje błąd 401 Unauthorized.

Załóżmy na przykład, że pytasz o foo.com. Serwer foo.com odpowiada przekierowaniem do bar.com. Listonosz lub Curl przekazują nagłówek Authorization do foo, a następnie do baru. Inne implementacje HTTP, takie jak Golang i Python, nie przekazują automatycznie nagłówka Authorization do przekierowanego URI.

Jak to działa

Poniższy diagram sekwencji pokazuje, co się dzieje, gdy nastąpi przekierowanie.

Sekwencja przekierowania

Dla porównania, oto co się dzieje, gdy przekierowanie nie występuje.

Brak sekwencji przekierowania

Przykład

Generalnie dobrą praktyką kodowania jest przewidywanie, że implementacja HTTP w Twoim języku może nie przekazać nagłówka Authorization.

Twój kod powinien zapobiegać automatycznemu przekierowywaniu i wykonywać wywołanie przekierowania po ponownym dodaniu nagłówków.

Na przykład w Go możesz to zrobić:

customClient := http.Client {
    CheckRedirect: func(redirRequest *http.Request, via []*http.Request)
    error {
        // Go's http.DefaultClient does not forward headers when a redirect 3xx
        // response is received. Thus, the header (which in this case contains the
        // Authorization token) needs to be passed forward to the redirect
        // destinations.
        redirRequest.Header = req.Header

        // Go's http.DefaultClient allows 10 redirects before returning an
        // an error. We have mimicked this default behavior.s
        if len(via) >= 10 {
            return errors.New("stopped after 10 redirects")
        }
        return nil
    },
}

Aby uzyskać więcej przykładów, zobacz:

Zapisz przekierowaną lokalizację

Najlepszą praktyką jest również przechowywanie przekierowanej lokalizacji z podziałem na użytkownika. Innymi słowy, po zalogowaniu się użytkownika i otrzymaniu przekierowania zapisz lokalizację firebase-apiserver03-tah01-iad01.dapi.production.nest.com:9553/ i przesyłaj wszystkie kolejne żądania bezpośrednio do tego identyfikatora URI.

Przechowywanie przekierowanej lokalizacji oszczędza czas i zapobiega niepotrzebnemu obciążeniu serwera.

Aby dowiedzieć się więcej o tym, jak odnoszą się do przekierowania ograniczającym szybkość, patrz dane limitu rytmu .

Używanie curl do testowania API

Używając curl >= v7.58, możesz otrzymać błędy 401 Unauthorized z wywołań API, które obejmują przekierowania. Od wersji curl 7.58 niestandardowe nagłówki autoryzacji nie są przekazywane do adresu URL przekierowania zwróconego przez interfejs API.

Aby uwzględnić to na zwinięcie> = v7.58, użyj --location-trusted flagę z jakichkolwiek połączeń linii poleceń.