Ricevo ["BAD CSRF"] aggiornando un argomento via API [python]

Ciao a tutti, ho problemi nell’aggiornare un argomento. Riesco a ottenere l’id del primo post come mostrato qui. Questo è confermato eseguendo quanto segue:

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)

Che restituisce un codice di stato 200 e le informazioni che mi aspettavo sul post.

Ma quando provo:

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": "Cool post, but here's an updated to the post's body",
      "edit_reason": "I changed this because I can."
   }
}
"""

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

print(resp.status_code)

Ottengo
["BAD CSRF"]

Sono un amministratore e la mia chiave è global. Idealmente, vorrei eseguire questo con una chiave meno permissiva.
Questo post è il primo e unico in un argomento che ho creato tramite l’API.

Grazie mille in anticipo :slight_smile:

Perché stai nidificando gli headers sotto questa chiave del dizionario Authorization? Questo non è documentato su Discourse REST API Documentation :thinking:

2 Mi Piace

Hai ragione, è qualcosa che sta facendo lo strumento che sto usando per testare l’API e funziona, e apparentemente questo è già di per sé un problema:

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

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

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

Quando HEADER == header1, funziona; quando == header2, ottengo:

{"errors":["Non sei autorizzato a visualizzare la risorsa richiesta. Il nome utente o la chiave API non sono validi."],"error_type":"invalid_access"}

Comunque, grazie per la tua risposta!