Vous souhaitez utiliser Discourse comme fournisseur d’identité pour votre propre application web ? Excellent ! Commençons.
Activer le paramètre du fournisseur DiscourseConnect
Dans les paramètres du site d’administration de Discourse (/admin/site_settings), activez le paramètre enable discourse connect provider et ajoutez une chaîne secrète à discourse connect provider secrets (utilisée pour hacher les charges utiles SSO).
Implémenter DiscourseConnect dans votre application web :
-
Générez un nonce aléatoire. Appelons cette valeur
NONCE. Sauvegardez-la temporairement afin de pouvoir la vérifier avec la valeur de nonce qui sera renvoyée dans la réponse. -
Créez une nouvelle charge utile avec le
NONCEet uneRETURN_URL(vers laquelle Discourse redirigera l’utilisateur après vérification). La charge utile doit ressembler à :nonce=NONCE&return_sso_url=RETURN_URL. L’hôte deRETURN_URLdoit correspondre au modèle de domaine que vous avez utilisé lors de la configuration dediscourse connect provider secrets. -
Encodez en Base64 la charge utile brute ci-dessus. Appelons cette charge utile
BASE64_PAYLOAD -
Encodez en URL la
BASE64_PAYLOADci-dessus. Appelons cette charge utileURL_ENCODED_PAYLOAD -
Générez une signature HMAC-SHA256 à partir de
BASE64_PAYLOADen utilisant votre secret de fournisseur sso comme clé, puis créez une chaîne hexadécimale en minuscules à partir de celle-ci. Appelons cette signatureHEX_SIGNATURE
Envoyer la requête d’authentification à Discourse
Redirigez l’utilisateur vers DISCOURSE_ROOT_URL/session/sso_provider?sso=URL_ENCODED_PAYLOAD&sig=HEX_SIGNATURE
Obtenir la réponse de Discourse :
Si les étapes ci-dessus sont effectuées correctement, Discourse redirigera l’utilisateur connecté vers la RETURN_URL fournie. Vous obtiendrez des paramètres de chaîne de requête avec sig et sso ainsi que des informations utilisateur. Suivez maintenant les étapes ci-dessous :
-
Calculez le HMAC-SHA256 de
ssoen utilisant le secret du fournisseur sso comme clé. -
Convertissez
sigde sa représentation en chaîne hexadécimale en octets. -
Assurez-vous que les deux valeurs ci-dessus sont égales.
-
Décodez en Base64
sso; vous obtiendrez la chaîne de requête intégrée transmise. Celle-ci aura une clé appeléenoncedont la valeur doit correspondre au nonce passé à l’origine. Assurez-vous que c’est le cas et veillez à supprimer le nonce de votre système. -
Vous constaterez que cette chaîne de requête contient également un ensemble d’informations utilisateur. Utilisez-les comme bon vous semble.
C’est tout. À ce stade, vous devriez avoir configuré votre application web pour utiliser Discourse comme fournisseur SSO !
Plus de paramètres, plus d’options
En plus de nonce et return_sso_url, la charge utile de la requête comporte plusieurs paramètres optionnels supplémentaires.
-
prompt: Siprompt=none, la requête SSO est traitée comme une requête « juste pour vérifier ». Si le navigateur/appareil est déjà connecté à Discourse, Discourse renverra une réponse SSO réussie portant les informations d’authentification de l’utilisateur, comme d’habitude. Si le navigateur/appareil n’est pas déjà connecté, Discourse ne demandera pas à l’utilisateur de se connecter et renverra immédiatement une réponse SSO portant le paramètrefailed=trueau lieu des informations utilisateur. Cela fournit un mécanisme pour interroger si l’utilisateur est connecté, sans jamais le diriger vers une boîte de dialogue de connexion s’il ne l’est pas. -
logout: Silogout=true, la requête SSO devient une requête de déconnexion. Si un utilisateur est connecté à Discourse sur ce navigateur/appareil, il sera déconnecté de cet appareil. Dans tous les cas, Discourse redirigera immédiatement vers lareturn_sso_url, sans quessoousigne soient ajoutés à la chaîne de requête. -
require_2fa: Sirequire_2fa=true, Discourse exigera que l’utilisateur vérifie l’authentification à deux facteurs avant d’être redirigé. La charge utile de réponse incluraconfirmed_2fa=truesi l’utilisateur a terminé avec succès la vérification 2FA, ouno_2fa_methods=truesi l’utilisateur n’a aucune méthode 2FA configurée.
prompt=none et logout=true sont mutuellement exclusifs ; il n’est pas logique de fournir les deux dans la même requête.
Référence de la charge utile sso=
Paramètres de requête :
nonce: (string, requis) une chaîne aléatoire générée de manière sécuriséereturn_sso_url: (string, requis) l’URL vers laquelle rediriger avec la réponseprompt: (string, facultatif) Sinone, sonde le statut d’authentification sans demander à l’utilisateur de se connecter.logout: (boolean, défautfalse) Sitrue, déconnecte l’utilisateur de Discourse.require_2fa: (boolean, défautfalse) Sitrue, exige que l’utilisateur vérifie l’authentification à deux facteurs avant d’être redirigé.
Paramètres de résultat :
-
Il n’y a pas de charge utile
sso=ni de signature en réponse à une requête de déconnexion, juste une redirection vers lareturn_sso_urlsimple de la requête. -
La charge utile de résultat pour une requête de connexion contiendra toujours le
nonce, reflété à partir de la requête. -
La charge utile de résultat reflétera également tous les autres paramètres de requête. Ne vous fiez pas à ce comportement ; il n’est pas nécessairement intentionnel et n’est pas un aspect garanti de l’API. (Par exemple, pourquoi le paramètre
return_sso_urlest-il copié dans la charge utile envoyée àreturn_sso_url?) -
Si la requête n’a pas réussi à authentifier un utilisateur, la charge utile de résultat contiendra
failed=true. -
Si la requête a réussi à authentifier un utilisateur, la charge utile de résultat contiendra les informations d’identification/informations de l’utilisateur :
external_id: (string) l’identifiant utilisateur Discourseusername: (string) nom d’utilisateur/identifiantname: (string) nom réel de l’utilisateuremail: (string) adresse e-mailavatar_url: (string) URL CDN complète de l’image d’avatar téléchargée par l’utilisateuradmin: (boolean)truesi l’utilisateur est un administrateur, sinonfalsemoderator: (boolean)truesi l’utilisateur est un modérateur, sinonfalsegroups: (string) liste séparée par des virgules des groupes (par nom) auxquels l’utilisateur appartientprofile_background_url: (string) URL CDN complète de l’image d’arrière-plan du profil de l’utilisateurcard_background_url: (string) URL CDN complète de l’image d’arrière-plan de la carte de l’utilisateurconfirmed_2fa: (boolean)truesi l’utilisateur a terminé la vérification 2FA (uniquement présent lorsquerequire_2fa=truea été demandé)no_2fa_methods: (boolean)truesi l’utilisateur n’a aucune méthode 2FA configurée (uniquement présent lorsquerequire_2fa=truea été demandé)
name,avatar_url,profile_background_urletcard_background_urlpeuvent être absents si l’utilisateur ne les a pas définis. (Tout élément avec une valeurnildans Discourse sera omis de la réponse.)
Implémentations officielles de Discourse pour « Utiliser Discourse comme fournisseur d’identité » :
- Un proxy http (utilisant golang) qui utilise le SSO Discourse pour authentifier les utilisateurs (uniquement les administrateurs) : GitHub - discourse/discourse-auth-proxy: An http proxy that uses the DiscourseConnect protocol to authenticate users · GitHub (fait par @sam)
Implémentations communautaires pour « Utiliser Discourse comme fournisseur SSO » :
-
Un script PHP qui implémente Discourse comme fournisseur SSO : Discourse sso provider login · GitHub (fait par @paxmanchris)
-
Erlang :
https://github.com/reverendpaco/discourse-as-sso-erlang -
Node.js :
GitHub - edhemphill/passport-discourse: A Passport strategy for authenticating using a Discourse forum · GitHub
GitHub - ArmedGuy/discourse_sso_node: npm package for Discourse SSO login features. · GitHub -
ASP.NET Core (ne nécessite qu’une configuration) :
GitHub - Biarity/DiscourseSso: Easy, configurable Discourse SSO: GET /auth/login -> recieve a JWT with user data · GitHub -
Extension MediaWiki (PHP) :
DiscourseSsoConsumer, a SSO extension for MediaWiki (fait par @mdoggydog)
