Un utilisateur non-admin peut-il émettre sa propre clé API ?

Bonjour :waving_hand:,

Je crée une action GitHub pour publier sur le forum Discourse.
J’ai trouvé l’API de publication, mais la documentation indique que les utilisateurs de Discourse doivent créer une clé API depuis le panneau d’administration, même si les utilisateurs non administrateurs n’ont pas accès à un panneau d’administration. Voici mes questions :

  • La clé API est-elle conçue pour les utilisateurs non administrateurs ?
  • Si oui, comment les utilisateurs non administrateurs peuvent-ils créer leur clé API ?
  • Si oui, y a-t-il des paramètres nécessaires pour activer la clé API pour les utilisateurs non administrateurs ?
    • La page des préférences du forum ne propose aucune interface pour créer une clé API. Je suppose donc qu’il existe des paramètres permettant aux utilisateurs de générer leurs propres clés API.

Merci d’avance ! :folded_hands:

1 « J'aime »

Bonjour @KengoTODA, bienvenue ici ! :slight_smile: :wave:

User API keys specification vous sera utile pour ce que vous avez décrit.

3 « J'aime »

Merci ! J’ai examiné la section « Flux de génération de clé API ».

J’ai compris qu’il s’agit d’applications web pouvant fournir une URL auth_redirect. Existe-t-il une méthode recommandée pour les interfaces en ligne de commande (CLI) ou GitHub Actions ?

Si cela concerne une GitHub Action, vous serez probablement mieux avisé de créer une clé API limitée à un périmètre défini, qui autorise uniquement les actions dont vous avez besoin. Cependant, oui, vous devrez être administrateur pour créer cette clé.

4 « J'aime »

Pour les programmes CLI, si cela est nécessaire, vous pouvez lancer un serveur web local et utiliser une URL http://localhost:XXXXX/callback. L’application fait quelque chose de similaire.

3 « J'aime »

OK, je vais essayer, merci pour votre soutien !

1 « J'aime »

Vous pouvez créer une clé API utilisateur en suivant Generate User API Keys for testing

2 « J'aime »

Je travaille sur cette branche et j’ai réussi à exécuter la commande en utilisant localhost comme URL de redirection. Cependant, après avoir cliqué sur le bouton pour autoriser, la page https://meta.discourse.org/user-api-key a signalé une erreur JavaScript et n’a pas pu poursuivre l’opération. Le script Ruby fonctionne, mais il échoue également lorsque j’ajoute le paramètre auth_redirect.

Voici l’exception rapportée dans la console du navigateur :

Uncaught TypeError: Cannot set property 'isReadOnly' of undefined
    at Function.createCurrent (_application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js:44867)
    at Function.current (_application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js:8816)
    at Object.initialize (_application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js:70403)
    at Object.i.initialize (_application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js:7001)
    at _ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:49660
    at i.each (_ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:67904)
    at i.walk (_ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:67891)
    at n.each (_ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:67858)
    at n.topsort (_ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:67758)
    at t._runInitializer (_ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:49667)

Je vais joindre une capture d’écran de l’analyse du code JS. Il semble que siteAttribtues soit censé avoir une valeur correcte, mais il est undefined. Si vous avez des suggestions, n’hésitez pas à me les faire savoir. Merci !

J’examine ce problème.

Le JS lève une erreur, car la méthode POST pour /user-api-key renvoie une erreur 403 et la méthode build_not_found_page dans le contrôleur n’appelle pas la méthode preload_anonymous_data qui stocke la valeur préchargée.

Il n’est pas certain pourquoi le serveur a répondu 403 avec <h1 class="title">Oups ! Cette page est privée.</h1> lorsque j’ai ajouté le paramètre auth_redirect. J’ai essayé d’utiliser le même domaine pour l’URL de rappel (pour vérifier un problème de faille de type cross-site scripting) et le protocole HTTPS, mais sans succès.

Vous devez ajouter le domaine (et le chemin) au paramètre du site allowed user api auth redirects.

Si vous émettez manuellement des requêtes HTTP, alors discourse://auth_redirect devrait fonctionner.

3 « J'aime »

Merci, j’ai trouvé la configuration dans site_settings.yml et compris pourquoi ma requête a retourné une erreur 403.

Le discourse://auth_redirect ne fonctionne pas comme prévu pour moi, donc je vais demander aux utilisateurs de saisir manuellement le token chiffré, tout comme dans le code Ruby.

Note pour les autres utilisateurs : j’ai créé un module Node.js qui peut être invoqué via la commande npx. Il générera une clé API avec la portée write. J’espère que cela facilitera la configuration des systèmes nécessitant un jeton d’API Discourse.

2 « J'aime »

Édition : Bonjour @KengoTODA. Votre code GitHub m’a été utile pour me diriger dans la bonne direction. Je suis encore en train de régler quelques détails, puis je rédigerai un bref compte rendu de la façon dont j’ai fait fonctionner les choses.

Le code GitHub de @KengoTODA m’a beaucoup aidé. J’ai maintenant une version fonctionnelle permettant d’authentifier les utilisateurs individuellement pour effectuer des appels API vers Discourse. J’ai décrit mes étapes ici : User API keys specification - #45 by JQ331

2 « J'aime »