Eu tive o mesmo problema que você descreve. O site que estou construindo pode ser acessado a partir de um telefone celular e do navegador, por isso preciso de uma API para permitir que os usuários se inscrevam, façam login e realizem algumas tarefas específicas. Além disso, preciso oferecer suporte à escalabilidade, o mesmo código em execução em diferentes processos / máquinas.
Como os usuários podem criar recursos (também conhecidos como ações POST / PUT), é necessário proteger sua API. Você pode usar oauth ou criar sua própria solução, mas lembre-se de que todas as soluções podem ser quebradas se a senha for realmente fácil de descobrir. A idéia básica é autenticar usuários usando o nome de usuário, senha e um token, também conhecido como apitoken. Esse apitoken pode ser gerado usando o node-uuid e a senha pode ser hash usando o pbkdf2
Então, você precisa salvar a sessão em algum lugar. Se você salvá-lo na memória em um objeto comum, se você matar o servidor e reiniciá-lo novamente, a sessão será destruída. Além disso, isso não é escalável. Se você usar haproxy para carregar o equilíbrio entre máquinas ou simplesmente usar trabalhadores, esse estado da sessão será armazenado em um único processo; portanto, se o mesmo usuário for redirecionado para outro processo / máquina, será necessário autenticar novamente. Portanto, você precisa armazenar a sessão em um local comum. Isso geralmente é feito usando redis.
Quando o usuário é autenticado (nome de usuário + senha + apitoken), gera outro token para a sessão, também conhecido como accesstoken. Novamente, com node-uuid. Envie ao usuário o accesstoken e o userid. O ID do usuário (chave) e o acesso (valor) são armazenados em redis com tempo de expiração, por exemplo, 1h.
Agora, toda vez que o usuário fizer alguma operação usando a API restante, será necessário enviar o ID do usuário e o token de acesso.
Se você permitir que os usuários se inscrevam usando a API restante, será necessário criar uma conta de administrador com uma apitoken de administrador e armazená-los no aplicativo móvel (criptografar nome de usuário + senha + apitoken) porque novos usuários não terão uma apitoken quando eles se inscrevem.
A web também usa essa API, mas você não precisa usar apitokens. Você pode usar express com uma loja redis ou usar a mesma técnica descrita acima, mas ignorando a verificação de apitoken e retornando ao usuário o ID do usuário + accesstoken em um cookie.
Se você tiver áreas privadas, compare o nome de usuário com os usuários permitidos quando eles se autenticarem. Você também pode aplicar funções aos usuários.
Resumo:
Uma alternativa sem apitoken seria usar HTTPS e enviar o nome de usuário e a senha no cabeçalho da Autorização e armazenar em cache o nome de usuário em redis.