Cómo manejar redireccionamientos

Algunos lenguajes de programación tienen implementaciones HTTP que requieren un manejo especial para los redireccionamientos.

En respuesta a una solicitud a la API de REST, el servidor de la API de Nest muestra un redireccionamiento. El cliente REST detecta el redireccionamiento y solicita la página a la que se redireccionó al cliente. Algunas implementaciones de HTTP no reenvían el encabezado de autorización al URI redireccionado, lo que da como resultado un error 401 Unauthorized.

Por ejemplo, supongamos que preguntas por foo.com. El servidor de foo.com responde con un redireccionamiento a bar.com. Postman o Curl pasan el encabezado de autorización a foo y luego a bar. Otras implementaciones HTTP, como Golang y Python, no pasan automáticamente el encabezado de autorización al URI redireccionado.

Cómo funciona

En el siguiente diagrama de secuencia, se muestra lo que sucede cuando se produce un redireccionamiento.

Secuencia de redireccionamiento

A modo de comparación, esto es lo que sucede cuando no se produce un redireccionamiento.

Sin secuencia de redireccionamiento

Ejemplo

En general, se recomienda anticipar que la implementación de HTTP de tu lenguaje podría no aprobar el encabezado de autorización.

Tu código debería evitar el redireccionamiento automático y realizar la llamada de redireccionamiento después de volver a agregar los encabezados.

Por ejemplo, en Go, puedes hacer lo siguiente:

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

Para obtener más ejemplos, consulta lo siguiente:

Almacena la ubicación redireccionada

También se recomienda almacenar la ubicación redireccionada por usuario. En otras palabras, después de que un usuario acceda y se reciba un redireccionamiento, almacena la ubicación firebase-apiserver03-tah01-iad01.dapi.production.nest.com:9553/ y realiza todas las solicitudes posteriores directamente a este URI.

El almacenamiento de la ubicación redireccionada ahorra tiempo y evita la carga innecesaria del servidor.

Para obtener más información sobre cómo se relacionan los redireccionamientos con el límite de frecuencia, consulta Límites de la frecuencia de datos.

Cómo usar curl para probar la API

Cuando usas curl >= v7.58, puedes recibir errores 401 no autorizados de llamadas a la API que implican redireccionamientos. A partir de curl v7.58, los encabezados de autorización personalizados no se reenvían a la URL de redireccionamiento que muestra la API.

Para dar cuenta de esto en curl >= v7.58, usa la marca --location-trusted con cualquier llamada a la línea de comandos.