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

Comment gérer les redirections

Certains langages de programmation ont des implémentations HTTP qui nécessitent un traitement spécial pour les redirections.

En réponse à une requête d'API REST, le serveur d'API Nest renvoie une redirection. Le client REST détecte la redirection et demande la page vers laquelle le client a été redirigé. Certaines implémentations HTTP ne transmettent pas l'en-tête d'autorisation à l'URI redirigé, ce qui entraîne une erreur 401 Unauthorized.

Par exemple, supposons que vous demandiez foo.com. Le serveur foo.com répond avec une redirection vers bar.com. Postman ou Curl transmettent l'en-tête d'autorisation à foo puis à bar. D'autres implémentations HTTP, telles que celles de Golang et Python, ne transmettent pas automatiquement l'en-tête d'autorisation à l'URI redirigé.

Comment ça fonctionne

Le diagramme de séquence suivant montre ce qui se passe lorsqu'une redirection se produit.

Séquence de redirection

À titre de comparaison, voici ce qui se passe lorsqu'une redirection ne se produit pas.

Pas de séquence de redirection

Exemple

En général, c'est une bonne pratique de codage d'anticiper que l'implémentation HTTP de votre langage pourrait ne pas passer l'en-tête d'autorisation.

Votre code doit empêcher la redirection automatique et effectuer l'appel de redirection après avoir rajouté les en-têtes.

Par exemple, dans Go, vous pouvez faire ceci :

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
    },
}

Pour plus d'exemples, voir :

Stocker l'emplacement redirigé

Il est également recommandé de stocker l'emplacement redirigé par utilisateur. En d'autres termes, une fois qu'un utilisateur s'est connecté et qu'une redirection a été reçue, stockez l'emplacement firebase-apiserver03-tah01-iad01.dapi.production.nest.com:9553/ et effectuez toutes les demandes ultérieures directement à cet URI.

Le stockage de l'emplacement redirigé permet de gagner du temps et d'éviter une charge inutile du serveur.

Pour en savoir plus sur la façon dont les redirections se rapportent à la limitation du débit, voir les limites Data Rate .

Utiliser curl pour tester l'API

Lorsque vous utilisez curl >= v7.58, vous pouvez obtenir 401 erreurs non autorisées provenant d'appels à l'API qui impliquent des redirections. Depuis curl v7.58, les en-têtes d'autorisation personnalisés ne sont pas transmis à l'URL de redirection renvoyée par l'API.

Pour tenir compte de cette boucle sur> = v7.58, utilisez la --location-trusted drapeau avec tous les appels de ligne de commande.