Resultados anómalos de la API

¡Hola!

Estoy intentando ejecutar una llamada a la API para crear un nuevo tema. Discourse API Docs

Usando Postman, envío la clave de API, el nombre de usuario y el tipo de contenido como encabezados, y los datos JSON en el cuerpo.

He verificado que el nombre de usuario y la clave de API son correctos, pero la llamada a la API devuelve el HTML de nuestra página de inicio de sesión.

¿Es esto esperado? ¿Cómo puedo solucionarlo?

¿Podrías pegar la versión de cURL de la llamada a la API que estás intentando realizar?

Claro…

curl -X POST 'https://staging-discuss.newrelic.com/posts.json' \
     -H 'Api-Username: RyanVeitch' -i \
     -H 'Api-Key: My-API-Key' -i \
     -H 'Content-Type: application/json' \
     -d \
'{
    "title": "Mi título elegante",
    "raw": "Algun texto aleatorio para llenar mi tema",
    "category": 212,
    "created_at": "2020-06-22"
}'

En la terminal obtengo esta salida:

HTTP/1.1 307 Temporary Redirect
Proxied-By: Service Gateway
Strict-Transport-Security: max-age=31536000; includeSubDomains
Location: https://staging-login.newrelic.com/login?return_to=https%3A%2F%2Fstaging-discuss.newrelic.com%2Fposts.json
content-type: text/plain;charset=UTF-8
content-length: 138

Redirigiendo a un URI diferente: https://staging-login.newrelic.com/login?return_to=https%3A%2F%2Fstaging-discuss.newrelic.com%2Fposts.json%

Avísame si necesitas algo más de mi parte para ayudar en la solución de problemas :smiley:

Parece que tienes una configuración muy personalizada con un proxy intermedio.

Eso no es un comportamiento estándar de Discourse, así que parece que esto es causado por tu proxy especial.

¿Quizás hay una cabecera especial que puedes enviar para omitir el proxy? Tendrás que revisar la documentación de ese producto.

¡Genial! Gracias @Falco, me pondré manos a la obra con nuestro equipo de desarrollo :slight_smile:

¡Hola @Falco! Logré pasar por el proxy, pero ahora estoy recibiendo errores de 403 BAD CSRF.

Veo que este hilo parece estar medio incompleto…

¿Tienes alguna idea sobre cómo solucionar estos errores?

Acabo de probar tu comando de ejemplo de curl localmente y funciona perfectamente para mí, por lo que la sintaxis es correcta. ¿Es posible que el proxy esté eliminando algunas cabeceras? Eso podría ser la razón por la que estás recibiendo errores de CSRF inválido, ya que ya no puede leer o acceder a las credenciales de la API.

Gracias @blake

Nuestro proxy es completamente personalizado, desarrollado internamente, y actúa como capa frontal para el público.

Estoy conectado a nuestra red interna mediante VPN y no estoy accediendo a la URL pública, sino a la URL del backend (detrás del proxy), por lo que las solicitudes no deberían pasar por el proxy.

Nuestra instancia de Discourse en staging es la versión 2.3.10.

¿Se comporta la API de manera diferente en esa versión?

No, la v2.3.10 todavía incluye todo lo relacionado con la autenticación basada en encabezados, por lo que no debería comportarse de manera diferente.

Estás golpeando esta línea:

lo que significa que tu solicitud está malformada de alguna manera y no puede detectar que es una solicitud de API.

Dado que se trata de una instancia de staging y no local, es probable que haya nginx u otro servidor web ejecutándose antes de que la solicitud llegue a Discourse. Es posible que nginx esté eliminando algunas cabeceras según tu configuración. Esto podría reflejarse en los registros de nginx.

Esta es la línea donde se leen las credenciales de la API desde las cabeceras de la solicitud. También podrías agregar algunas sentencias de depuración en este archivo para determinar si las cabeceras llegan hasta aquí.

@blake

¡Gracias! Lo consultaré con nuestro equipo de desarrollo :smiley:

Aprecio tu ayuda