Discourse contient un système pour générer des clés d’API par utilisateur si un protocole très spécifique est suivi. Cette fonctionnalité facilite l’accès « applicatif » aux instances Discourse sans nécessiter l’implication des modérateurs.
Description générale
En résumé :
- Le client (application de bureau, plugin de navigateur, application mobile) génère une paire de clés privée/publique et une URL de retour
- Le client redirige vers une route sur Discourse en lui fournissant sa clé publique
- Discourse obtient l’approbation de l’utilisateur pour utiliser l’application
- Discourse génère une clé d’API utilisateur
- Discourse redirige vers l’URL de retour avec une charge utile chiffrée utilisant la clé publique contenant la clé d’API utilisateur
Détails
Cas d’utilisation :
- Applications de bureau qui interrogent des sites Discourse au nom des utilisateurs finaux pour obtenir les comptes de notification sur plusieurs sites.
- Applications mobiles qui interrogent des sites Discourse au nom des utilisateurs finaux et gèrent les notifications push.
- Applications Web qui fournissent un tableau de bord aux utilisateurs finaux concernant divers sites Discourse.
- Intégrations personnalisées avec des applications tierces qui consomment Discourse dans le cadre d’une application d’entreprise générale. Par exemple : intégrer les notifications de la communauté Discourse dans l’application hopscotch.
La conception :
Paramètres du site
-
allow_user_api_key_scopes: étendues d’accès autorisées pour les clés d’API utilisateur. Les étendues sont définies ici. Les étendues intégrées disponibles sont :
read,write,message_bus,push,one_time_password,notifications,session_info,bookmarks_calendar,user_status(les plugins peuvent enregistrer des étendues supplémentaires). -
user_api_key_allowed_groups: contrôle quels groupes sont autorisés à générer des clés d’API utilisateur (par défaut : administrateurs, modérateurs et trust_level_0)
-
allowed_user_api_push_urls: liste des sites pouvant être des cibles pour les notifications push
-
allowed_user_api_auth_redirects: destinations de redirection autorisées après la génération de la clé d’API utilisateur
Paramètres globaux
- max_user_api_reqs_per_minute: 20
- max_user_api_reqs_per_day: 2880
Éléments UX
Si des clés d’API utilisateur ont été accordées, Discourse affiche un onglet applications sur la page de l’utilisateur.
L’onglet applications listera :
- Le nom de l’application (par exemple : (« Discourse Notifier »))
- Date de dernière utilisation
- Date d’approbation
- Liste des étendues d’accès accordées
- Un bouton révoquer l’accès pour pouvoir révoquer facilement toutes les clés
Interface utilisateur d’autorisation de clé d’API
Chaque clé devra être explicitement autorisée par les utilisateurs finaux sur une page qui explique clairement ce qui se passe, par exemple :
« Discourse Notifier » demande l’accès suivant à votre compte :
- Lire et effacer les notifications
- Lire les informations de session de l’utilisateur
- Créer un jeton de connexion unique
[Autoriser]
Flux de génération de clé d’API
L’API ne nécessite qu’une seule requête GET du côté de l’utilisateur.
https://sitename.com/user-api-key/new
Depuis Discourse 2.1, ces clés d’API utilisateur expirent automatiquement si elles ne sont pas utilisées pendant de longues périodes. Le paramètre du site :
revoke user api keys unused daysest défini sur 180 par défaut.
Paramètres :
- auth_redirect: URL vers laquelle rediriger avec le jeton généré
- application_name: nom de l’application effectuant la requête (affiché dans l’onglet Applications du compte utilisateur)
- client_id: identifiant unique pour le client
- nonce: un nonce unique généré par le client. Il sera renvoyé dans la charge utile chiffrée afin que le client puisse vérifier l’authenticité de la réponse
- scopes: liste séparée par des virgules des étendues d’accès autorisées pour la clé, consultez
allow user api key scopespour la liste complète des étendues disponibles - push_url: URL vers laquelle envoyer les notifications push (requis et valide uniquement si
pushounotificationssont inclus dans les étendues) - public_key: partie publique de la paire de clés générée par le client
- padding (optionnel) : le mode de rembourrage RSA à utiliser pour chiffrer la charge utile. Les valeurs acceptées sont
pkcs1(par défaut) ouoaep. OAEP est recommandé pour les nouvelles applications.
Après l’appel de /user-api-key/new avec les bons paramètres, 2 choses peuvent se produire :
- Si l’utilisateur n’est pas connecté, nous le redirigerons vers la connexion (après la connexion, nous reprendrons l’autorisation)
- Une fois qu’un utilisateur est connecté, l’interface utilisateur d’autorisation lui sera présentée.
Après l’autorisation, le système redirigera vers l’URL définie dans auth_redirect et inclura un paramètre payload chiffré contenant un objet JSON avec la clé d’API utilisateur générée (key), le nonce, l’état push (push) et la version de l’API (api). Si l’étendue one_time_password a été demandée, un paramètre de requête oneTimePassword chiffré séparé sera également inclus. client_id n’est pas renvoyé pour une sécurité accrue.
Vérification de la version de l’API
L’API d’utilisation des clés dans Discourse est versionnée. Les clients peuvent vérifier la version de l’API d’un site Discourse en effectuant une requête HEAD vers https://sitename.com/user-api-key/new. La réponse contiendra un en-tête nommé Auth-Api-Version contenant le numéro de version de l’API du site.
Consommation de l’API
La consommation de l’API client sera quelque peu différente de l’API d’administration actuelle.
Le client peut spécifier 2 en-têtes :
User-Api-Key (requis) : la clé qui a été générée
et
User-Api-Client-Id (optionnel) : fournissez ceci pour mettre à jour l’« identifiant client » stocké pour cette api_key dans la base de données.
Une fois ces en-têtes spécifiés, le client peut effectuer des requêtes contre l’API comme il le ferait normalement.
Génération d’un mot de passe de connexion unique
Depuis la version 4, l’API inclut une étendue spéciale : l’étendue one_time_password, qui permet aux clients d’utiliser la clé d’API utilisateur pour générer un mot de passe à usage unique. Si le client inclut cette étendue lors de la génération de la clé d’API en suivant les étapes ci-dessus, un oneTimePassword chiffré sera inclus en tant que paramètre de requête séparé dans la redirection vers le client.
Alternativement, le client peut effectuer une requête GET vers /user-api-key/otp avec les paramètres suivants :
- auth_redirect
- application_name
- public_key
- padding (optionnel)
et avec l’en-tête User-Api-Key.
Cette requête redirigera vers un écran dans Discourse qui demandera à l’utilisateur d’autoriser l’application à accéder au site. Si l’utilisateur approuve, le site redirigera vers l’URL définie dans auth_redirect et inclura un paramètre oneTimePassword chiffré avec un mot de passe à usage unique que le client pourra utiliser pour se connecter au site en demandant https://sitename.com/session/otp/ONE-TIME-PASSWORD. (Le mot de passe à usage unique n’est valable que 10 minutes.)
Révocation des clés d’API
Pour révoquer une clé d’API, effectuez une requête POST avec l’en-tête User-Api-Key et aucun paramètre vers /user-api-key/revoke.
Dernière révision par @SaraDev le 2022-07-13T00:00:00Z

