Erhalte ["BAD CSRF"] beim Aktualisieren des Themas über die API [python]

Hallo zusammen, ich habe Probleme beim Aktualisieren eines Themas. Ich kann die id des ersten Beitrags ermitteln, wie hier gezeigt. Dies wird durch die Ausführung des folgenden Codes bestätigt:

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)

Dies gibt einen Statuscode 200 zurück sowie die erwarteten Informationen über den Beitrag.

Wenn ich jedoch Folgendes versuche:

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": "Cooler Beitrag, aber hier ist ein Update für den Beitragstext",
      "edit_reason": "Ich habe dies geändert, weil ich es kann."
   }
}
"""

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

print(resp.status_code)

erhalte ich ["BAD CSRF"].

Ich bin Administrator und mein Schlüssel ist global. Idealerweise würde ich dies mit einem weniger privilegierten Schlüssel ausführen möchten. Dieser Beitrag ist der erste und einzige in einem Thema, das ich über die API erstellt habe.

Vielen Dank im Voraus :slight_smile:

Warum verschachtelst du die Header unter diesem Authorization-Schlüssel? Das ist nicht dokumentiert unter Discourse REST API Documentation :thinking:

2 „Gefällt mir“

Du hast recht, das ist etwas, das das Tool, das ich zum Testen der API verwende, tut, und es funktioniert – und das ist anscheinend bereits ein Problem an sich:

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

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

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

Wenn HEADER == header1 ist, funktioniert es. Wenn es == header2 ist, erhalte ich:

{"errors":["Sie dürfen die angeforderte Ressource nicht einsehen. Der API-Benutzername oder der Schlüssel ist ungültig."],"error_type":"invalid_access"}

Übrigens, danke für deine Antwort!