Connexion automatique avec le plugin OpenId Connect et AWS Cognito

Bonjour. Tout nouveau sur Discourse. J’ai une application en cours d’exécution sur AWS, qui utilise Cognito pour l’authentification. Je souhaite lier cette application à mon nouveau forum hébergé sur Discourse. J’ai fait de bons débuts, mais j’espère que quelqu’un pourra me guider sur les dernières étapes à suivre.

L’objectif est de rendre l’expérience de connexion transparente entre mon application et le forum Discourse. Ainsi :

  • Si un utilisateur est connecté à mon application, lorsqu’il se rend sur le forum Discourse, ce dernier le reconnaît et ne nécessite pas de nouvelle connexion.

  • De même, si un utilisateur se rend d’abord sur le forum Discourse et n’est pas connecté, Discourse le redirigera vers la page de connexion de mon application (ou vers une interface de connexion hébergée si nécessaire).

Le plugin d’authentification OpenID Connect semble être bien conçu pour cela. J’ai souscrit à un plan Business avec Discourse pour m’assurer de pouvoir utiliser ce plugin.

J’ai suivi les instructions fournies par @david et j’ai effectué ce que je crois être la configuration côté Cognito :

  1. Depuis Cognito, j’ai obtenu le « document de découverte OpenID Connect » et l’« ID du client OpenID Connect ».

  2. Dans les paramètres de mon Discourse, sous openId_Connect, je les ai ajoutés et enregistrés.

  3. J’ai coché « activer l’authentification OpenID Connect », et sous « portée d’autorisation OpenID Connect », j’ai saisi « openid email ». J’ai enregistré ces paramètres.

Selon la description du plugin, cela devrait être prêt, n’est-ce pas ?

Eh bien, lorsque je me connecte à mon application, puis que je me rends sur mon forum, rien ne se passe. Il affiche simplement la page d’accueil normale avec les boutons « s’inscrire » et « se connecter ». J’espère qu’il me connecte automatiquement après avoir vérifié auprès de Cognito, mais ce n’est pas le cas. Que dois-je faire d’autre ?

De plus, si un utilisateur arrivait sur le site du forum fraîchement (sans jamais s’être connecté à mon application), il ne devrait pas voir les boutons d’inscription et de connexion de Discourse ; il devrait plutôt voir un bouton sur lequel il cliquerait pour être redirigé vers la page de connexion de mon application. Comment ajouter cela ?

Et enfin, les utilisateurs s’abonnent à mon application et paient pour utiliser des fonctionnalités premium. Cela est enregistré en tant qu’attributs personnalisés pour l’utilisateur dans Cognito (il existe un attribut personnalisé indiquant Abonné ou non). Seuls les utilisateurs abonnés devraient pouvoir publier sur le forum. Ainsi, lorsque Discourse vérifie auprès de Cognito pour obtenir les informations de l’utilisateur, il doit vérifier l’attribut personnalisé de l’utilisateur, et seulement si l’utilisateur est abonné, lui donner la capacité de publier. Comment faire cela ?

Étant si nouveau sur Discourse, j’apprécierais grandement toute information que quiconque pourrait avoir sur l’une de ces questions. Merci !

Salut @JQ331 :wave:

La connexion automatique n’est prise en charge que si votre site est privé (le paramètre du site login_required est activé).

Cela devrait déjà fonctionner ainsi. Assurez-vous de désactiver toutes les autres méthodes de connexion, y compris les « connexions locales ».

Malheureusement, cela n’est pas possible avec le plugin OIDC.

@david, merci beaucoup pour votre réponse. C’est très utile.

Où se trouve ce paramètre de site « login_required » ? Par « privé », voulez-vous dire que les utilisateurs ne peuvent voir le contenu du site que s’ils sont connectés ? Évidemment, ce n’est pas ce que je souhaite ici. Je veux simplement que la connexion soit requise pour publier, et que la seule façon de se connecter soit via mon application séparée.

Je suppose que vous parlez de paramètres → connexion → activer les connexions locales (décochez cette case). J’ai donc décoché tout ce qui concerne les connexions locales. Mais que devrais-je cocher ici ? Par exemple, si j’utilise le plugin pour lier mon application séparée à la connexion, cette application séparée est-elle un « SSO » ou un « OAuth2 » ? (Je me demande, par exemple, si je devrais sélectionner « SSO remplace l’email » ou « OAuth2 remplace l’email » ?)

Concernant la restriction de publication aux seuls utilisateurs payants :

C’est une exigence fondamentale, donc je devrai peut-être être créatif. Existe-t-il une autre option que le plugin SSO ? Sinon, je pourrais encore envisager que cela fonctionne si l’une des possibilités suivantes est réalisable :

  1. Discourse propose différents niveaux de permissions utilisateur. Ainsi, je pourrais faire en sorte qu’un utilisateur soit connecté, mais sans avoir la permission de publier ou de répondre aux messages. Dans ce cas, je devrais définir le niveau de permission de l’utilisateur en fonction des informations que Discourse reçoit de Cognito (abonné ou non).

  2. Si cela ne fonctionne pas, Discourse dispose-t-il d’un plugin Stripe fonctionnel qui permet aux utilisateurs d’être connectés, mais ne peuvent publier que s’ils sont à jour de leurs paiements via le système Stripe ?

  3. Si aucune de ces options ne fonctionne — par exemple, si Discourse n’a pas la capacité de distinguer les niveaux de privilèges utilisateur que je peux définir — alors il semblerait que je devrais faire en sorte qu’un utilisateur soit soit connecté, soit non, et que seuls les utilisateurs connectés puissent publier. Cela semble-t-il correct ?

Si c’est le cas, je devrai alors trouver de mon côté, au niveau de mon application, comment indiquer à Discourse de ne connecter l’utilisateur que s’il est à jour de ses paiements dans mon application.

Merci.

Dans ce cas, la connexion automatique n’est pas actuellement prise en charge. Les utilisateurs devront cliquer sur le bouton de connexion.

D’accord, le bouton de connexion devrait maintenant rediriger directement vers votre fournisseur d’identité. Cela fonctionne-t-il ?

Oui, vous pouvez configurer toutes vos catégories pour que « tout le monde » puisse lire. Mais seuls les utilisateurs d’un groupe spécifique peuvent créer ou répondre aux sujets. Si vous souhaitez automatiser cela, vous pouvez utiliser l’API pour ajouter ou supprimer des personnes d’un groupe.

Cool – il semble que je sois assez proche. Juste pour confirmer :

Je souhaite que les éléments suivants soient vrais :

  1. Tout le monde peut lire le contenu du site (connecté ou non).
  2. Seuls les utilisateurs connectés peuvent publier.
  3. Si vous êtes connecté à mon application, lorsque vous accédez à Discourse, elle communique avec Cognito et vous connecte automatiquement, vous permettant ainsi de publier.

Est-ce que vous dites que le point (3) n’est pas possible ? Vous affirmez que, pour une raison quelconque, la connexion automatique ne se produit que si le contenu du site est masqué au public ?


Cela semble être ce que je souhaite faire. En vous entendant dire « utilisez l’API », je suppose que vous voulez dire quelque chose comme :

  1. Un utilisateur tente de se connecter à mon forum.
  2. Il est redirigé pour se connecter à mon application.
  3. Lorsqu’il se connecte à mon application, celle-ci vérifie s’il est à jour de ses paiements ou non. S’il est à jour, mon application effectue un appel à l’API de Discourse pour ajouter cette personne au « groupe » autorisé à publier et à répondre.

Est-ce bien cela ? Si oui, existe-t-il une documentation de référence pour comprendre comment ajouter des personnes à des groupes via l’API ?

Merci, cela me fait vraiment avancer.

Je pense que nous avons peut-être des définitions différentes de la « connexion automatique ».

Discourse peut se connecter à un fournisseur OIDC pour la connexion. Ce processus est lancé lorsque l’utilisateur clique sur le bouton « Connexion » du forum. Cela fonctionne toujours, quelle que soit la configuration.

Si un site exige une connexion (c’est-à-dire que le paramètre « Connexion requise » est activé), l’utilisateur est redirigé directement vers l’écran de connexion OIDC sans avoir besoin de cliquer sur le bouton.

Oui, c’est bien ce à quoi je pensais. Voici une documentation sur ce point de terminaison de l’API.

Super. Merci ! Je vais jeter un coup d’œil à cette documentation API. Cela semble très prometteur.

Concernant la question de la « connexion automatique » — il semble que vous vouliez dire « connexion automatique = envoyer automatiquement l’utilisateur vers un écran de connexion ». Donc, si je comprends bien, lorsque un utilisateur se rend sur mon forum Discourse, il y a deux options :

Option 1 : Le site « automatiquement » l’envoie vers la page de connexion de l’application séparée. Cela se produit que l’utilisateur soit déjà connecté à mon application ou non. (C’est ce que vous décrivez comme « connexion automatique », et vous indiquez que cela se produit si vous définissez « login_required ».)

Option 2 : Le site ne fait aucune redirection automatique. À la place, il y a un bouton de connexion de base sur la page. Si un utilisateur clique sur ce bouton ou tente de publier, le forum le redirige vers la page de connexion de mon application.

J’espérais une Option 3 : Si un utilisateur est connecté à mon application, lorsqu’il se rend sur mon forum Discourse, celui-ci vérifie auprès de Cognito si l’utilisateur est connecté ou non. S’il est connecté à Cognito, alors Discourse le connecte au forum, sans que l’utilisateur ait à se reconnecter séparément.

Je suis nouveau sur les sujets OpenID, mais j’étais convaincu que c’était possible, car si un utilisateur doit se connecter séparément à l’application et aussi au forum lorsqu’il passe de l’un à l’autre, ce n’est pas une expérience fluide.

N’y a-t-il pas un moyen pour le forum Discourse de vérifier auprès de Cognito et d’ajuster le statut de connexion de l’utilisateur sans que celui-ci ait à passer par un processus de connexion séparé ?

Au passage, je suppose que l’intégration directe de Discourse dans mon application ne résoudrait pas le problème. Je le ferais si c’était possible, mais il semble que cela ne soit réalisable qu’avec des iframes, ce qui n’aiderait pas pour le problème d’authentification.

C’est techniquement possible selon la spécification OIDC, mais malheureusement, Discourse ne le prend pas encore en charge.

Hmm. J’ai entendu dire qu’il existe deux méthodes pour créer un lien entre Discourse et un fournisseur d’authentification externe comme Cognito : le plugin OpenId ou l’utilisation de Single Sign On pour Discourse.

Je ne connais pas du tout le processus Single Sign On, mais cela pourrait-il permettre de réaliser ce que je souhaite, à savoir éviter que les utilisateurs se connectent deux fois ?

Ou peut-être simplement, lorsqu’ils se connectent à mon application, envoyer un appel API à Discourse pour les connecter ainsi ?

(Le document que j’ai lié mentionne également la spécification de l’appartenance à des groupes ; je suppose que cela permettrait d’obtenir ce que je veux, c’est-à-dire que seuls les utilisateurs PAYANTS puissent appartenir au groupe autorisé à publier.)