J’ai réussi à faire fonctionner cela, après quelques essais et erreurs.
Voici les étapes de base que je suis lorsque j’ai une application distincte que j’ai codée et que je souhaite que les utilisateurs puissent l’utiliser pour effectuer des appels API vers un site Discourse.
Pour ce faire, je dois générer un jeton API par utilisateur afin d’effectuer des appels au nom de chaque utilisateur spécifique (du moins dans un environnement Node.js/JavaScript).
Notez que pour la partie JavaScript, j’ai trouvé le code fourni par @KengoTODA ici très utile : discourse-api-key-generator/src/index.ts at main · KengoTODA/discourse-api-key-generator · GitHub
Voici les étapes que j’ai suivies :
Premièrement : Générer une paire de clés publique et privée.
C’est quelque chose que votre application doit générer : une clé publique et une clé privée. Le Gist GitHub fournit une méthode pour y parvenir.
Deuxièmement : Avoir une URL de redirection.
C’est l’URL vers laquelle Discourse redirigera, en fournissant le jeton API final dans la charge utile. Si vous avez une application de bureau (c’est-à-dire sans URL de navigateur), l’URL de redirection sera basée sur un protocole personnalisé que vous avez configuré et qui ouvre l’application lorsque l’URL de redirection est saisie dans le navigateur.
Notez que l’URL de redirection doit être ajoutée à la liste blanche dans les paramètres du site du site Discourse cible.
Le site Discourse doit également probablement avoir l’option « Autoriser les clés API utilisateur » cochée dans ses paramètres. Consultez le message original sur ce sujet pour les « Paramètres du site ».
Troisièmement : Envoyer l’appel de requête API à l’URL de requête de Discourse.
Votre application enverra donc un appel à une URL qui suit ce format :
https://[votre site Discourse cible .com]/user-api-key-new
en ajoutant les paramètres suivants :
- le nom de votre application
- votre « client_id » (j’ai pu utiliser hostname(), depuis
const {hostname} = require('os')pour une application de bureau, tout comme dans le Gist GitHub référencé ci-dessus) - les portées (scopes) (ce sont les actions que vous souhaitez que l’utilisateur puisse effectuer via l’API, comme « write », « read », etc.)
- votre clé publique (de l’étape 1 ci-dessus)
- votre URL de redirection (de l’étape 2 ci-dessus)
- nonce (c’est une valeur que vous pouvez choisir – par exemple, utiliser simplement ‘1’ semble fonctionner)
Quatrièmement : L’utilisateur autorise votre application sur la page du site Discourse ouverte par l’URL de requête
Lorsque vous envoyez l’URL de requête avec succès, une page s’ouvre sur le site Discourse indiquant à l’utilisateur que votre application souhaite accéder au site.
Sur cette page, il y a un bouton permettant à l’utilisateur d’autoriser cette action. Lorsque l’utilisateur clique sur ce bouton, le site Discourse redirige vers l’URL de redirection que vous avez fournie et attache en paramètre un ?payload=[LA CLÉ API]. La CLÉ API ici est la clé que vous devez décoder dans votre application.
Cinquièmement : Votre application récupère la valeur de l’URL de redirection (avec la valeur de la charge utile), et vous décodez la CLÉ API
Vous y êtes presque. Votre application doit analyser l’URL de redirection vers laquelle Discourse a redirigé et récupérer la clé API contenue dans la charge utile.
Une fois que vous avez cette clé API, vous devez faire deux choses :
- Obtenir la clé réelle, et non la version encodée en URL : si vous récupérez un paramètre depuis une URL, il est souvent encodé en URL (ajout de % ici et là, etc.). Vous devez le nettoyer. En JavaScript, j’ai trouvé que
decodeURIComponentfonctionne pour cela. - Une fois que vous avez la CLÉ API nettoyée renvoyée par Discourse, vous devez la décoder. Pour ce faire, vous pouvez utiliser le décodage JavaScript avec des clés privées. Fondamentalement, vous utilisez votre clé privée (générée à la première étape ci-dessus) pour décoder la CLÉ API nettoyée. Il existe un exemple de code JavaScript dans le Gist GitHub que j’ai référencé ci-dessus : discourse-api-key-generator/src/index.ts at main · KengoTODA/discourse-api-key-generator · GitHub
Après avoir exécuté votre code de décodage, vous obtenez le jeton lui-même, que vous pouvez maintenant utiliser pour effectuer des appels API authentifiés au nom de l’utilisateur.
Sixièmement : Utiliser le jeton (c’est-à-dire la CLÉ API finale, nettoyée et décodée) pour effectuer des appels API au nom de l’utilisateur
Avec ce jeton, il semble que vous n’ayez pas besoin de saisir le nom d’utilisateur dans l’appel API. Je trouve que l’en-tête suivant est suffisant lorsque vous l’incluez dans vos appels GET, POST, PUT, etc. :
headers: {
"User-Api-Key": [le jeton]
}
Et avec cela, vous avez hopefully une méthode d’authentification par utilisateur fonctionnelle pour interagir avec Discourse.