Tenho um fórum Discourse funcionando, onde os usuários podem criar um login local (nome de usuário + senha).
Gostaria de reutilizar o login e a senha deles em outro aplicativo. Em outras palavras: os usuários inserem o nome de usuário e a senha no outro aplicativo, e o aplicativo deve ser capaz de verificar se este é um login válido para o fórum.
Tenho lido a documentação da API do Discourse. Muitas coisas são possíveis, incluindo definir nome de usuário e senha para um determinado usuário, mas não encontrei um endpoint de API para validar um nome de usuário e senha existentes em relação à lista de usuários do fórum.
Presumo que tal endpoint de API deva existir, pois o fórum deve ser capaz de fazer isso para fazer login de um usuário através da interface web.
Qual é o endpoint da API para verificar nome de usuário e senha para fazer login no fórum?
Mais diretamente, você pode usar o DiscourseConnect como um mecanismo para validar usuários ou, fora de sua aplicação, usar o discourse-auth-proxy.
Estes são métodos sugeridos para autenticar usuários em vez de lidar diretamente com credenciais de login. Isso também significa que você não precisa tentar lidar com detalhes de 2FA.
Na verdade, minha "outra aplicação" é um aplicativo desktop, não um aplicativo web. Acho que o discourse-auth-proxy não funcionará nesse caso.
Na página do DiscourseConnect, uma das primeiras afirmações é esta:
Muitos sites que desejam se integrar a um site Discourse querem manter todo o registro de usuários em um site separado. Nessa configuração, todas as operações de login devem ser terceirizadas para esse site diferente.
Isso é exatamente o oposto do que eu quero fazer: quero terceirizar todas as operações de login para o Discourse. Existe alguma maneira de usar o DiscourseConnect para fazer isso?
A coisa complicada é que existe um segredo compartilhado entre o provedor (Discourse) e o consumidor (seu aplicativo). Se você distribuir seu aplicativo, os usuários terão acesso a todos os segredos nele.
Colocar um proxy de autenticação na frente de um serviço web mínimo personalizado que fornece um token assinado ao seu aplicativo pode funcionar bem.
Tenho certeza de que existem outras maneiras de fazer isso que não estou pensando.
Você está se referindo à chave de API? Parece possível criar uma chave de API “granular”, que tenha acesso apenas a pontos de extremidade específicos da API. Ainda não está claro para mim quais pontos de extremidade seriam necessários se eu usar essa abordagem. Você sabe?
Sim, um serviço web mínimo com um proxy de autenticação pode ser uma boa solução; terei que experimentar um pouco para descobrir.
Não exatamente - seria o valor discourse connect provider secrets para o aplicativo, que precisaria ser definido em conjunto com enable discourse connect provider.
Se entendi corretamente, este método significaria que o usuário faz login usando um navegador. Isso pode funcionar, embora eu esperasse encontrar um método onde nome de usuário e senha pudessem ser inseridos em nosso aplicativo desktop, sem abrir um navegador.
Entendo que a abordagem que tenho em mente não suportará TFA a menos que eu a implemente, e que não suportará logins via provedores de terceiros (Google, Facebook, Discord, …).
Pelo que entendo neste momento, parece que o método usado no exemplo do Reactive Native pode ser transposto para nossa aplicação desktop (que é em Python).
O ponto de acesso da API usado parece ser <site>/session, e ele recebe um nome de usuário, senha e um token csrf. O token csrf pode ser obtido em <site>/session/csrf.
Isso é muito próximo do que eu estava procurando. Acho que vou tentar isso, reportarei se funcionar para mim.
O ponto de acesso da API <site>/session está documentado em algum lugar?
A melhor maneira de obter o que você deseja em um aplicativo desktop é usando as Chaves de API de Usuário.
Você precisa de uma interface web, seja no aplicativo ou abrindo o navegador, mas se você fizer seu aplicativo ser um manipulador para o protocolo usado pelos aplicativos móveis, você pode facilmente obter o token dessa maneira e só precisar usar o navegador novamente se o token expirar ou eles usarem um dispositivo diferente.
Minha experiência pessoal com isso é que usar as Chaves de API de Usuário é uma opção muito mais segura e simples do que tentar usar os endpoints de sessão.
Aqui estão 20 linhas de código Python que fazem aproximadamente o mesmo que o código React Native referido por @renato (exceto que não há compatibilidade com o Discourse 2.5 - eu não preciso disso)
Funciona bem, assumindo que você está usando login básico baseado em nome de usuário e senha. Ainda vou investigar os métodos alternativos, usando o login SSO do Discourse conforme configurado na instância do Discourse.
Tentei aplicar isso, mas não consigo fazer funcionar. Abaixo está um código Python (simplificado) que gera uma URL para .../session/sso_provider. Quando tento, recebo Login Error. Não faço ideia do que isso significa.
Como administrador, ative o verbose discourse connect logging, tente, e então verifique /logs no seu fórum para ver erros mais detalhados, por exemplo https://forum.embeetle.com/logs
Aliás, você precisa revogar e alterar este segredo imediatamente porque qualquer pessoa com ele pode fazer login no seu aplicativo, como acabei de fazer durante o teste.