O SPA não tem gerenciamento próprio de usuários, gostaria de usar o Discourse para isso (porque não temos outras coisas específicas do usuário que precisariam de um gerenciamento próprio de usuários).
Mas eu gostaria de mostrar o usuário atualmente logado do Discourse no SPA, bem como mostrar um widget dos tópicos não lidos (que são específicos do usuário), por exemplo, então preciso carregar dados via API do Discourse.
Coisas que tentei:
Usar o Discourse SSO Path, que então redireciona de volta para meu SPA. Tudo bem, recebo o endereço de e-mail do usuário atual, ID externo e assim por diante - mas nada com o qual eu pudesse fazer a solicitação (token / chave).
Brincar com as configurações de cookie para poder usar o cookie do Discourse para fazer a solicitação (sem sucesso).
Li sobre a chave de API do usuário em User API keys specification, mas me sentiria estranho o usuário permitir que um aplicativo, que é o mesmo site, acesse sua conta do Discourse.
Existe alguma possibilidade de alcançar o comportamento que desejo?
Crie uma chave de API com os escopos que você precisa e acesso a “todos os usuários”.
Obviamente, você não pode passar essa chave para o aplicativo web no lado do cliente sem comprometer o site, então você precisará encaminhar as solicitações do aplicativo web através do backend desse aplicativo para sua instância do Discourse. (E você precisaria validar se o nome de usuário é legítimo pelo backend — eu não analisei o DiscourseConnect, mas presumivelmente há uma maneira de fazer isso.)
(PS: Recomendo usar ‘example.com’ para seu domínio de exemplo. Alguém poderia comprar o que você vinculou e configurar spam ou malware ou o que quer que seja, enquanto example.[com|org|net] são reservados oficialmente.)
Sim, essa é realmente a forma como eu costumava implementar agora.
Enviando o usuário através do SSO, o Middleware cria um usuário simples com nome, e-mail e um array de tokens, cria um token, passa de volta para a SPA.
O middleware faz proxy das requisições para o discourse com uma chave de API de todos os usuários e valida o “token de sessão” (para ver qual usuário é) e alguma outra mágica de segurança.
Para permitir que o usuário permaneça logado, usarei um cookie / armazenamento local e sincronizarei o logout através da opção de logout direto do discourse.
Funciona, mas ainda acredito que deveria haver uma opção melhor do que lidar com um token de API de administrador em combinação com um nome de usuário. Quebra se algum administrador mudar o nome de usuário de alguém… Eu gostaria de um ID hash ou algo assim… Mas nada que eu possa mudar, então vou conviver com isso