Accesso tramite Discourse API, chiave e/o utente rifiutato

In qualità di moderatore, vorrei utilizzare l’API per un forum di discussione. Normalmente era attiva e sono riuscito a ottenere una chiave API. Ho utilizzato questo script:

Sono riuscito a recuperare una chiave lunga 32 caratteri (è corretto?), e nelle impostazioni di sicurezza del mio account, l’app mostra queste autorizzazioni:

Leggi tutto
Scrivi tutto
Aggiornamenti in tempo reale
Notifiche push a servizi esterni
Leggi e cancella notifiche
Leggi informazioni sulla sessione utente
Crea un token di accesso una tantum

Sembra abbastanza buono. Tuttavia, quando provo ad accedere tramite uno script con:

from pydiscourse import DiscourseClient

client = DiscourseClient(
        'https://forum.example.com',
        api_username='tflidd',
        api_key='388b79103056fede1d3223dae032df99')

client.user("tflidd")

È una libreria Python, quindi suppongo che dovrebbe funzionare. La chiave API ha questo formato specifico, non è la chiave effettiva. Ricevo l’errore che l’username o la chiave API non sono validi.

Devo usare il mio username o il nome dell’app?
La chiave API ha almeno il formato corretto, forse la decrittazione di qualcosa è andata storta?

Se uso curl come qui (Discourse-user-notes API - #4 by codetricity):

curl https://forum.example.com/t/95783.json\ -H 'Api-Key: 388b79103056fede1d3223dae032df99'\ -H 'Api-Username: tflidd'

Ricevo anche un errore:
{"errors":["You are not permitted to view the requested resource. The API username or key is invalid."],"error_type":"invalid_access"}

Se apro lo stesso URL con il json nel mio browser dove sono loggato, il browser web mostra l’oggetto json corretto. Quindi l’argomento esiste e ho i permessi per accedervi (questo era anche uno pubblico).

Sono solo un moderatore, senza accesso diretto all’amministratore. Potrei chiedere maggiori informazioni dai log, se avete indicazioni su cosa cercare.

Nel caso in cui sia rilevante, la versione installata è: 3.2.0.beta4-dev

La libreria python DiscourseClient è progettata per funzionare con una chiave API Admin (Admin → API).
Ciò che generi da generate_api_key è una chiave API Client.
Devi passare le intestazioni API-User-Key e API-User-Username invece.
Per esempio:

curl https://forum.example.com/t/95783.json -H 'Api-User-Key: 388b79103056fede1d3223dae032df99' -H 'Api-User-Username: tflidd'

:+1: questo funziona, non sai quanto tempo ho impiegato per questo.

Ma gli endpoint dell’API sono gli stessi descritti qui

?

(se sì, sarebbe fantastico menzionare non solo come autenticarsi con la chiave API dell’amministratore, ma anche menzionare la chiave API del client)

Per il client pydiscourse, esiste una soluzione di ripiego per utilizzare un header diverso:

from pydiscourse import DiscourseClient

client = DiscourseClient(
        'https://forum.example.com',
        api_username='tflidd',
        api_key='388b79103056fede1d3223dae032df99')

headers = {
            "Accept": "application/json; charset=utf-8",
            "User-Api-Key": '388b79103056fede1d3223dae032df99',
            "User-Api-Username": 'tflidd',
        }

slug = "abc"
topic_id = 1234

client.topic(slug=slug, topic_id=topic_id, override_request_kwargs=override_request_kwargs)
1 Mi Piace