WordPress SSO et connexion Patreon

Hi again! I had a question. A client of mine wants to gradually move his membership from Patreon to Wordpress (via Woocommerce Memberships). I know this is possible based on other forum posts.

However, my question is, if we enable SSO with Wordpress as the provider, is wordpress the ONLY way to sign into the forums? Would enabling SSO with Wordpress no longer allow Patreon users to sign in via their Patreon accounts? Or, is it possible to have both running together?

Sorry if this is confusing or the wrong place to be asking this.

Thanks in advance!

2 « J'aime »

Yes, the first S in SSO is Single. Wordpress becomes authoritative for all authentication.

That said, if Patreon is providing user email addresses the users can register on Wordpress to get back into their accounts providing the use the same address.

3 « J'aime »

You could also allow users to login to your WordPress site via Patreon with Patreon WordPress – WordPress plugin | WordPress.org. I have not tested this, but it should be possible to allow users to login to WordPress via Patreon while still having SSO login between WordPress and Discourse. If you try that and have any problems getting it to work, please let us know.

3 « J'aime »

Hi! I have tested this setup and it basically works! :slight_smile:
The only issue I found is that it doesn’t redirects to Discourse after successful login - it returns user to wordpress. User have to manually go to Discourse and then hit “Log In” button again to get registered. I wonder if this can be fixed somehow?

I have recorded the video to show how it works -

1 « J'aime »

Thanks for trying that. It sounds like the SSO parameters that are required for logging the user into Discourse are getting stripped during the Patreon login process. If that is the case, there probably isn’t anything that can be done to fix the issue.

2 « J'aime »

I wonder, can this be fixed by modifying Wordpress-Patreon plugin? Does it worth to contact its authors? :slight_smile:

If the cause of the issue is what I think it is, then modifying the WordPress Patreon plugin could fix the issue. What I think is causing the problem is that the WordPress Patreon plugin is stripping the sso and sig query parameters that are sent with the Patreon login request. It could be worth contacting that plugin’s developers about the issue.

Before doing that, you should confirm that clicking the Login button on Discourse, for a user who is not currently logged into WordPress takes the user to the WordPress login page. If the user then selects the Patreon login option, they are logged into WordPress but not logged into Discourse. Note that if your Discourse site is set to be private, the above should happen if a user browses directly to your Discourse site. For that case, the user will not see a Login button on Discourse.

2 « J'aime »

Bonjour ! J’ai soumis un rapport aux développeurs du plugin Patreon : Redirecting not working when using together with Discourse SSO - Wordpress Plugin - Patreon Developers

Oui, je peux confirmer cela :

  • cliquer sur le bouton Connexion sur Discourse, pour un utilisateur qui n’est pas actuellement connecté à WordPress redirige l’utilisateur vers la page de connexion de WordPress - :white_check_mark: OUI

  • Si l’utilisateur sélectionne ensuite l’option de connexion Patreon, il est connecté à WordPress - :white_check_mark: OUI

  • mais pas connecté à Discourse - :white_check_mark: OUI - sur la vidéo ci-dessus à 0:32, on voit que l’utilisateur n’est pas connecté.

D’accord, j’ai trouvé une solution de contournement qui « résout » le problème de connexion à Patreon. Veuillez trouver les instructions ci-dessous. :slight_smile:

Vous aurez besoin de :

  • N’importe quel plugin fournissant un shortcode pour afficher un formulaire de connexion (j’ai WooCommerce installé sur mon site, j’ai donc utilisé le shortcode [woocommerce_my_account], qui fait exactement cela pour les utilisateurs non connectés).
  • Le plugin Members, qui fournit les shortcodes [members_logged_in] et [members_not_logged_in] pour masquer/afficher du contenu en fonction de la connexion de l’utilisateur. Vous pouvez utiliser tout autre plugin offrant une fonctionnalité de shortcode similaire.
  • Le plugin Shortcode Redirect.

L’idée est de créer une page spéciale qui affiche un formulaire de connexion (et un bouton de connexion Patreon) pour les utilisateurs non connectés. Si l’utilisateur est connecté, il doit être redirigé vers l’URL https://community.morevnaproject.org/session/sso?return_path=%2F.
(Bien sûr, vous devrez remplacer « community.morevnaproject.org » par votre propre domaine).

Ma page de connexion spéciale contient le code suivant :

[members_not_logged_in]
   [woocommerce_my_account]
   [patreon_login_button]
[/members_not_logged_in]
[members_logged_in]
   [redirect url='https://community.morevnaproject.org/session/sso?return_path=%2F' sec='0']
[/members_logged_in]

(vous pouvez le voir en action ici - Log In / Register — Morevna Project)

Ensuite, tout ce que vous avez à faire est de configurer le plugin WP-Discourse pour utiliser cette page pour le SSO :

Lorsque l’utilisateur clique sur le bouton « Se connecter » dans Discourse, il est redirigé vers ma page WordPress spéciale. Comme l’utilisateur n’est pas connecté, le formulaire de connexion s’affiche. Si l’utilisateur clique sur le bouton « Se connecter avec Patreon », il est redirigé vers Patreon pour l’autorisation. Après une autorisation réussie, il est renvoyé vers ma page spéciale. Comme l’utilisateur est maintenant connecté, le shortcode « redirect » est activé :

[redirect url='https://community.morevnaproject.org/session/sso?return_path=%2F' sec='0']

…et l’utilisateur est redirigé avec succès vers les forums Discourse.

La partie session/sso?return_path=%2F à la fin de l’URL est requise, sinon Discourse ne reconnaîtra pas l’utilisateur comme connecté après la redirection.

C’est tout ! J’espère que cela aidera d’autres utilisateurs qui souhaitent avoir un SSO WordPress avec connexion Patreon sur leur site web. :slight_smile:

2 « J'aime »

Bon travail pour avoir trouvé cela :+1:

Je ne veux pas minimiser le travail que vous avez accompli, mais ma première impression est que vous devriez envisager d’utiliser un service d’authentification externe (tel que okta.com ou auth0.com) à ce stade. Chaque fois que vous arrivez au point de connecter trois services différents (par exemple Patreon, WordPress et Discourse) pour obtenir une authentification unique en une seule étape, c’est le signe que vous devriez envisager une solution d’authentification dédiée. Que vous puissiez ou non y parvenir d’une manière ou d’une autre, il existe un risque non négligeable à long terme que votre solution tombe en panne ou ne fonctionne pas dans tous les cas.

Si vous souhaitez tout de même emprunter cette voie, j’ai quelques suggestions, mais sachez que cela va devenir un peu technique. Je les ajoute ici en partie au cas où d’autres personnes tomberaient dessus et voudraient aller plus loin.

J’ai jeté un coup d’œil rapide au code du plugin Patreon pour WordPress et il semble que leur flux OAuth accepte une clé/valeur final_redirect_uri dans le paramètre state, ce qui vous permettrait de passer directement de l’authentification Patreon à l’authentification SSO de Discourse, éliminant ainsi le besoin des plugins Members et Redirect mentionnés ci-dessus, et évitant tout problème qui pourrait survenir avec cette approche.

De nombreux services d’authentification disposent d’une version du paramètre final_redirect_uri, c’est-à-dire un paramètre qui vous permet de modifier l’endroit où l’utilisateur est redirigé après l’authentification. Si vous lisez ceci parce que vous essayez de résoudre le même problème, mais avec un service différent (autre que Patreon), et que vous avez également décidé que mon avertissement contre la connexion de trois services différents ne s’applique pas, c’est là que vous devriez chercher.

Cela signifie que vous voudriez que le shortcode qui génère le bouton de connexion Patreon accepte un final_redirect_uri en tant qu’argument, qui serait ensuite transmis à l’URL de connexion finale utilisée par Patreon. En examinant le code du plugin Patreon pour WordPress, c’est une proposition réalisable. Pour vous donner une idée, la fonction pertinente qui génère l’URL Patreon ressemble à ceci :

Patreon_Frontend::patreonMakeLoginLink(false, array( 'final_redirect_uri' => # ) );

Fondamentalement, le code est déjà partiellement configuré pour gérer un final_redirect_uri personnalisé. Je comprends pourquoi les développeurs du plugin Patreon pour WordPress pourraient ne pas vouloir l’ajouter, mais si vous vous sentez assez à l’aise pour décrire ce que j’ai expliqué ici, cela pourrait valoir la peine de créer un problème sur leur dépôt GitHub. À défaut, vous pouvez utiliser la fonction que j’ai référencée ci-dessus pour générer un lien vous-même et créer votre propre bouton (ou engager un développeur WordPress pour le faire).

Juste une petite remarque sur la construction de l’URL SSO, il est plus clair d’utiliser

https://discourse.example.com/session/sso?return_path=/

au lieu de

https://discourse.example.com/session/sso?return_path=%2F

Ce dernier élément, le return_path, est le chemin vers lequel l’utilisateur est redirigé dans Discourse après la connexion. S’il s’agit de /, ils seront envoyés à la page d’accueil du forum. Pour en savoir plus sur la construction des URL SSO, consultez WP Discourse Tips and Tricks.

3 « J'aime »

+1 oui, il y a un risque ! :slight_smile:

Ouah, merci beaucoup pour les instructions détaillées ! Donc, il est logique de modifier le shortcode [patreon_login_button] pour accepter le paramètre final_redirect_uri et de faire une PR sur leur dépôt GitHub. Merci encore d’avoir pris le temps de m’expliquer !

1 « J'aime »