Possível enviar um link de login por e-mail via API?

Olá! Estou adorando usar a API do Discourse!

Seguindo o guia sobre engenharia reversa da API, encontrei um problema ao tentar fazer a API enviar um link de login.

Contexto do motivo pelo qual estou fazendo isso
Criei um serviço de SSO para um hackerspace local, para que os usuários possam fazer login no nosso Discourse usando o sistema de associação do hackerspace.

No entanto, algumas pessoas podem ter usado um endereço de e-mail diferente no sistema de associação em comparação ao do Discourse. Como o login local está desativado quando o SSO está habilitado, gostaria que as pessoas pudessem clicar em “Envie-me um link de login” para serem autenticadas e, em seguida, atualizarem seu endereço de e-mail, se desejarem (ou continuarem usando o link de login, o que preferirem).

Objetivo
Gostaria de enviar um link de login para o usuário @ domain .co.uk via API.

Tentei o seguinte:

curl -X POST "https://discourse.<site>.org.uk/u/email-login" --data "{\"login\":\"user%40domain.co.uk\"}" -H "Api-Key: xxxxx" -H "Api-Username: system" -H "Content-Type: application/json"

O que recebo de volta é:

<html><body>Você está sendo <a href="https://discourse.<site>.org.uk/">redirecionado</a>.</body></html>

Se eu não incluir a chave de API, recebo [BAD CSRF].

Então, onde estou travado é: como posso fazer o Discourse enviar um link de login para o usuário @ domain .co.uk via API?

Muito obrigado por qualquer ajuda. Vou continuar tentando coisas para ver o que funciona.


P.S. Gostaria de não precisar usar uma “gambiarra” como:
Fazer uma solicitação a /session/csrf e salvar o token CSRF.
Em seguida, fazer uma solicitação a /u/email-login com o token CSRF.

É possível fazer isso apenas com uma chave de API?

Obrigado!
:slight_smile:

Só para dar um retorno: usar a rota CSRF seguida pela rota de link por e-mail é a maneira correta de fazer isso?

Não há nenhuma implementação disso na API quando uma chave de API é fornecida?

Como seu serviço de SSO se integra ao Discourse? Se você estiver usando o DiscourseConnect, acredito que o endpoint /u/email-login estará desabilitado.

Obrigado pela sua resposta. E sim, está usando o Discourse Connect.

Veja, eu também pensei isso, então desativei o Discourse Connect e tentei obter um link de login enviado, mas não consegui fazê-lo funcionar. Foi assim que obtive a saída no meu post acima.

Se obter um link por e-mail estiver desativado quando o Discourse Connect estiver habilitado, terei que repensar minha abordagem sobre como vincular contas do serviço SSO do sistema de membros ao Discourse.

A maneira mais fácil, como você mencionou, é que as contas sejam vinculadas por endereço de e-mail. Quando isso não for possível, existem algumas abordagens que costumamos usar:

  1. Vincular usuários usando algum outro identificador único. Você pode pré-criar associações do DiscourseConnect para um usuário via console. Isso só funcionará se você tiver algum outro identificador que seja consistente entre o Discourse e o Provedor de Identidade.

  2. (mais comum) permitir que os usuários se cadastrem para novas contas e, em seguida, pedir que eles entrem em contato com um administrador para solicitar que a nova conta seja “fundida” com a antiga (usando o botão na parte inferior da página de administração do usuário). Isso irá automaticamente vincular os e-mails e criar a associação do DiscourseConnect.

Obrigado pela sua resposta.

A abordagem de mesclar contas é provavelmente o que vou seguir.

Seria um ótimo recurso tornar esse processo autoatendível — talvez por meio de uma API onde os usuários possam fazer login por meio de um link enviado por e-mail, permitindo que atualizem seu endereço de e-mail para sincronizar as duas contas.
Ou, alternativamente, permitindo que o usuário se autentique fornecendo seu e-mail e senha do Discourse, juntamente com um novo endereço de e-mail.

Obrigado novamente pelo seu tempo.