Recebendo ["BAD CSRF"] ao atualizar tópico via API [python]

E aí, pessoal, estou com problemas ao atualizar um tópico. Consegui obter o id da primeira postagem, conforme mostrado aqui. Isso foi confirmado ao executar o seguinte:

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)

O que retorna um código de status 200 e as informações esperadas sobre a postagem.

Mas quando tento:

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": "Post legal, mas aqui está uma atualização no corpo da postagem",
      "edit_reason": "Mudei isso porque posso."
   }
}
"""

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

print(resp.status_code)

Recebo:
["BAD CSRF"]

Sou administrador e minha chave é global. Idealmente, gostaria de executar isso com uma chave menos permissiva.
Esta postagem é a primeira e única em um tópico que criei via API.

Muito obrigado desde já :slight_smile:

Por que você está aninhando os cabeçalhos sob a chave de dicionário Authorization? Isso não está documentado em Discourse REST API Documentation :thinking:

2 curtidas

Você tem razão, isso é algo que a ferramenta que estou usando para testar a API está fazendo, e funciona — e isso, por si só, parece ser um 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, funciona; quando == header2, recebo:

{"errors":["Você não tem permissão para visualizar o recurso solicitado. O nome de usuário ou a chave da API são inválidos."],"error_type":"invalid_access"}

A propósito, obrigado pela sua resposta!