Accès via l'API Discourse, clé et/ou utilisateur rejeté

En tant que modérateur, j’aimerais utiliser l’API pour un forum Discourse. Normalement, elle était activée et j’ai réussi à obtenir une clé API. J’ai utilisé ce script :

J’ai réussi à récupérer une clé qui fait 32 caractères de long (est-ce correct ?), et dans les paramètres de sécurité de mon compte, l’application s’affiche avec ces autorisations :

Lire tout
Écrire tout
Mises à jour en direct
Notifications push vers des services externes
Lire et effacer les notifications
Lire les informations de session utilisateur
Créer un jeton de connexion unique

Cela semble plutôt bien. Cependant, lorsque j’essaie d’accéder via un script avec :

from pydiscourse import DiscourseClient

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

client.user("tflidd")

C’est une bibliothèque Python, donc je suppose qu’elle devrait fonctionner. La clé API a ce format spécifique, ce n’est pas la clé réelle. Je reçois une erreur indiquant que le nom d’utilisateur ou la clé API ne sont pas valides.

Dois-je utiliser mon nom d’utilisateur ou le nom de l’application ?
La clé API a-t-elle au moins le bon format, peut-être que le déchiffrement a échoué ?

Si j’utilise curl comme ici (Discourse-user-notes API - #4 by codetricity) :

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

J’obtiens également une erreur :
{"errors":["You are not permitted to view the requested resource. The API username or key is invalid."],"error_type":"invalid_access"}

Si j’ouvre la même URL avec le JSON dans mon navigateur où je suis connecté, le navigateur web affiche le bon objet JSON. Donc le sujet existe et j’ai les permissions pour y accéder (c’était même un sujet public).

Je suis juste modérateur, sans accès administrateur direct. Je pourrais demander plus d’informations dans les logs, si vous avez des pistes à explorer.

Au cas où cela aurait de l’importance, la version installée est : 3.2.0.beta4-dev

La bibliothèque Python DiscourseClient est conçue pour fonctionner avec une clé API Admin (Admin → API).
Ce que vous générez à partir de generate_api_key est une clé API Client.

Vous devez plutôt passer les en-têtes API-User-Key et API-User-Username.
Par exemple :

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

:+1: ça marche, vous ne savez pas combien de temps j’ai passé là-dessus.

Mais les points de terminaison de l’API sont les mêmes que ceux décrits ici

?

(si oui, ce serait formidable de mentionner non seulement comment s’authentifier avec la clé d’API admin, mais aussi la clé d’API client)

Pour le client pydiscourse, il existe une solution de contournement astucieuse pour utiliser un en-tête différent :

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 « J'aime »