Obtenir ["BAD CSRF"] lors de la mise à jour du sujet via API [python]

Salut à tous, je rencontre des problèmes pour mettre à jour un sujet. Je parviens à obtenir l’id du premier message comme indiqué ici. Cela est confirmé en exécutant ce qui suit :

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)

Ce qui renvoie un code de statut 200 et les informations attendues concernant le message.

Mais lorsque j’essaie :

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": "Super message, mais voici une mise à jour du corps du message",
      "edit_reason": "Je l'ai changé parce que je le peux."
   }
}
"""

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

print(resp.status_code)

Je reçois
["BAD CSRF"]

Je suis administrateur et ma clé est global. Idéalement, je souhaiterais exécuter cela avec une clé moins permissive.
Ce message est le premier et unique dans un sujet que j’ai créé via l’API.

Merci beaucoup par avance :slight_smile:

Pourquoi imbriquez-vous les en-têtes sous cette clé de dictionnaire Authorization ? Cela n’est pas documenté sur Discourse REST API Documentation :thinking:

2 « J'aime »

Vous avez raison, c’est quelque chose que l’outil que j’utilise pour tester l’API fait, et cela fonctionne ; cela semble être un problème en soi :

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

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

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

Lorsque HEADER == header1, cela fonctionne ; lorsque c’est header2, je reçois :

{"errors":["Vous n'êtes pas autorisé à consulter la ressource demandée. Le nom d'utilisateur ou la clé API est invalide."],"error_type":"invalid_access"}

Merci pour votre réponse, au fait !