Obteniendo ["BAD CSRF"] al actualizar tema vía API [python]

Hola a todos, estoy teniendo problemas para actualizar un tema. Puedo obtener el id del primer mensaje como se muestra aquí. Esto se confirma ejecutando lo siguiente:

import requests
from requests.structures import CaseInsensitiveDict

url = "https://my/discourse/instance/posts/{post_id}.json"

headers = CaseInsensitiveDict()
headers["Authorization"] = "{\"api-key\": \"{le_api_key}\", \"api-username\": \"{le_username}\"}"

resp = requests.get(url, headers=headers)

print(resp.status_code)

Lo cual devuelve un código de estado 200 y la información que esperaba sobre el mensaje.

Pero cuando intento:

import requests
from requests.structures import CaseInsensitiveDict

url = "https://my/discourse/instance/posts/{post_id}.json"

headers = CaseInsensitiveDict()
headers["Authorization"] = "{\"api-key\": \"le_api_key\", \"api-username\": \"le_username\"}"
headers["Content-Type"] = "application/json"

data = """
{
  "post": {
      "raw": "Mensaje genial, pero aquí hay una actualización al cuerpo del mensaje",
      "edit_reason": "Cambie esto porque puedo."
   }
}
"""

resp = requests.put(url, headers=headers, data=data)

print(resp.status_code)

Obtengo [\"BAD CSRF\"].

Soy administrador y mi clave es global. Idealmente, me gustaría ejecutar esto con una clave menos permisiva.
Este mensaje es el primero y único en un tema que creé mediante la API.

¡Muchas gracias de antemano :slight_smile:

¿Por qué estás anidando los encabezados bajo esta clave de diccionario Authorization? Eso no está documentado en Discourse REST API Documentation :thinking:

2 Me gusta

Tienes razón, eso es algo que está haciendo la herramienta que estoy usando para probar la API, funciona y eso, aparentemente, es un problema en sí mismo:

header1 = CaseInsensitiveDict()
header1["Authorization"] = '{"api-key": "longapikey", "api-username": "myusername"}'

header2 = {"api-key": "longapikey", "api-username": "myusername"}

r = requests.get(url, headers= HEADER)

Cuando HEADER == header1, funciona; cuando es == header2, obtengo:

{"errors":["No tienes permiso para ver el recurso solicitado. El nombre de usuario o la clave de la API son inválidos."],"error_type":"invalid_access"}

¡Gracias por tu respuesta, por cierto!