WordPress SSO e Login Patreon

Olá novamente! Eu tinha uma dúvida. Um cliente meu quer migrar gradualmente a assinatura dele do Patreon para o WordPress (via WooCommerce Memberships). Sei que isso é possível com base em outros tópicos do fórum.

No entanto, minha pergunta é: se ativarmos o SSO com o WordPress como provedor, o WordPress será a ÚNICA maneira de fazer login nos fóruns? Ao ativar o SSO com o WordPress, os usuários do Patreon deixarão de poder fazer login com suas contas do Patreon? Ou é possível ter ambos funcionando simultaneamente?

Desculpe se isso está confuso ou se este não é o lugar certo para fazer essa pergunta.

Obrigado desde já!

Sim, o primeiro S em SSO é de Single. O WordPress torna-se a autoridade para toda autenticação.

Dito isso, se o Patreon estiver fornecendo os endereços de e-mail dos usuários, eles podem se registrar no WordPress para recuperar o acesso às suas contas, desde que utilizem o mesmo endereço.

Você também pode permitir que os usuários façam login no seu site WordPress via Patreon com Patreon WordPress – WordPress plugin | WordPress.org. Não testei isso, mas deve ser possível permitir que os usuários façam login no WordPress via Patreon, mantendo ainda o login SSO entre WordPress e Discourse. Se você tentar e tiver algum problema para fazê-lo funcionar, por favor, nos avise.

Olá! Testei essa configuração e ela funciona basicamente! :slight_smile:
O único problema que encontrei é que não redireciona para o Discourse após o login bem-sucedido — ele retorna o usuário ao WordPress. O usuário precisa ir manualmente ao Discourse e clicar novamente no botão “Entrar” para se registrar. Será que isso pode ser corrigido de alguma forma?

Gravei um vídeo mostrando como funciona:

Obrigado por tentar. Parece que os parâmetros SSO necessários para fazer o login do usuário no Discourse estão sendo removidos durante o processo de login no Patreon. Se for esse o caso, provavelmente não há nada que possa ser feito para corrigir o problema.

Eu me pergunto, isso pode ser corrigido modificando o plugin Wordpress-Patreon? Vale a pena entrar em contato com seus autores? :slight_smile:

Se a causa do problema for o que eu acredito, modificar o plugin WordPress Patreon pode resolver a questão. O que, na minha opinião, está causando o problema é que o plugin WordPress Patreon está removendo os parâmetros de consulta sso e sig enviados junto com a solicitação de login do Patreon. Pode valer a pena entrar em contato com os desenvolvedores desse plugin sobre o problema.

Antes de fazer isso, você deve confirmar que clicar no botão Entrar no Discourse, para um usuário que não está atualmente logado no WordPress, leva o usuário à página de login do WordPress. Se o usuário então selecionar a opção de login do Patreon, ele será logado no WordPress, mas não no Discourse. Note que, se o seu site Discourse estiver configurado como privado, o acima deve acontecer se um usuário navegar diretamente para o seu site Discourse. Nesse caso, o usuário não verá um botão Entrar no Discourse.

Olá! Enviei um relatório para os desenvolvedores do plugin Patreon - Redirecting not working when using together with Discourse SSO - Wordpress Plugin - Patreon Developers

Sim, posso confirmar isso:

  • clicar no botão de Login no Discourse, para um usuário que não está atualmente logado no WordPress, leva o usuário à página de login do WordPress - :white_check_mark: SIM

  • Se o usuário então selecionar a opção de login do Patreon, eles serão logados no WordPress - :white_check_mark: SIM

  • mas não serão logados no Discourse - :white_check_mark: SIM - no vídeo acima em 0:32 mostra que o usuário não está logado.

Ok, encontrei uma solução alternativa que ‘resolve’ o problema com o login do Patreon. Confira as instruções abaixo. :slight_smile:

Você precisará de:

  • Qualquer plugin que forneça um shortcode para exibir o formulário de login (eu tenho o WooCommerce instalado no meu site, então usei o shortcode [woocommerce_my_account], que faz exatamente isso para usuários não logados).
  • Plugin Members, que fornece os shortcodes [members_logged_in] e [members_not_logged_in] para ocultar/mostrar conteúdo dependendo se o usuário está logado ou não. Você pode usar qualquer outro plugin que ofereça funcionalidade de shortcode semelhante.
  • Plugin Shortcode Redirect.

A ideia é criar uma página especial que exibe um formulário de login (e o botão de login do Patreon) para usuários não logados. E se o usuário estiver logado, ele deve ser redirecionado para a URL https://community.morevnaproject.org/session/sso?return_path=%2F.
(Obviamente, você desejará substituir “community.morevnaproject.org” pelo seu próprio domínio).

Minha página de login especial tem o seguinte conteúdo:

[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]

(você pode ver em ação aqui - Log In / Register — Morevna Project)

Em seguida, tudo o que você precisa fazer é configurar o plugin WP-Discourse para usar essa página para SSO -

Quando o usuário clica no botão “Log In” no Discourse, ele é redirecionado para minha página especial do WordPress. Como o usuário não está logado, o formulário de login é exibido. Se o usuário clicar no botão “Log in with Patreon”, ele será redirecionado para o Patreon para autorização. Após a autorização bem-sucedida, ele é redirecionado de volta para minha página especial. Como o usuário agora está logado, o shortcode “redirect” é ativado:

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

…e o usuário é redirecionado com sucesso de volta para os fóruns do Discourse.

A parte session/sso?return_path=%2F no final da URL é necessária; caso contrário, o Discourse não reconhecerá o usuário como logado após o redirecionamento.

É isso! Espero que isso ajude outros usuários que desejam ter SSO do WordPress com login do Patreon em seus sites. :slight_smile:

Ótimo trabalho em descobrir isso :+1:

Não quero diminuir o trabalho que você já fez, mas minha primeira impressão é que você deve considerar usar um serviço de autenticação externo (como okta.com ou auth0.com) neste momento. Sempre que você chegar ao ponto de conectar três serviços diferentes (por exemplo, Patreon, WordPress e Discourse) para realizar uma única autenticação de uma só vez, isso é um sinal de que você deve considerar uma solução dedicada de autenticação. Independentemente de ser possível alcançar isso de alguma forma, há um risco considerável de longo prazo de que sua solução possa falhar ou não funcionar em todos os casos.

Se você ainda quiser seguir por esse caminho, tenho algumas sugestões, mas aviso que isso ficará um pouco técnico. Estou adicionando isso aqui em parte caso alguém mais encontre isso e queira levar isso adiante.

Dê uma olhada rápida no código do plugin Patreon para WordPress e parece que o fluxo OAuth deles aceita uma chave/valor final_redirect_uri no parâmetro state, o que permitiria ir diretamente da autenticação do Patreon para o SSO do Discourse, eliminando a necessidade dos plugins Members e Redirect mencionados acima, e evitando quaisquer problemas que possam surgir com essa abordagem.

Muitos serviços de autenticação têm uma versão do parâmetro final_redirect_uri, ou seja, um parâmetro que permite alterar para onde o usuário é enviado após a autenticação. Se você está lendo isso porque está tentando resolver o mesmo problema, mas com um serviço diferente (ou seja, outro que não seja o Patreon), e também decidiu que meu aviso contra conectar três serviços diferentes não se aplica, então é aí que você deve procurar.

Isso significa que você gostaria que o shortcode que gera o botão de login do Patreon aceitasse um final_redirect_uri como argumento, que seria então passado para a URL de login final usada pelo Patreon. Analisando o código do plugin Patreon para WordPress, isso é uma proposta viável. Para dar uma ideia, a função relevante que gera a URL do Patreon se parece com isto:

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

Basicamente, o código já está parcialmente configurado para lidar com um final_redirect_uri personalizado. Posso entender por que os desenvolvedores do plugin Patreon para WordPress podem não querer adicioná-lo, mas se você se sentir confiante o suficiente para descrever o que descrevi aqui, pode valer a pena criar uma issue no repositório deles no GitHub. Caso contrário, você pode usar a função que referenciei acima para gerar um link você mesmo e criar seu próprio botão (ou contratar um desenvolvedor WordPress para fazer isso).

Apenas uma nota menor sobre a construção da URL do SSO, é um pouco mais claro usar

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

em vez de

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

A última parte, o return_path, é o caminho para onde o usuário será enviado no Discourse após o login. Se for /, eles serão enviados para a página inicial do fórum. Para mais informações sobre a construção da URL do SSO, consulte WP Discourse Dicas e Truques.

+1 sim, há um risco! :slight_smile:

Uau, muito obrigado pelas instruções detalhadas! Então, faz sentido modificar o shortcode [patreon_login_button] para aceitar o parâmetro final_redirect_uri e fazer um PR no repositório deles no GitHub. Obrigado novamente por dedicar seu tempo para explicar!