Acabei combinando meu fluxo de trabalho original com o exemplo de autenticação do Express, visto aqui . É o seguinte:
- Quando o usuário carrega inicialmente o aplicativo, uma chamada http é feita para um terminal Express que verifica se já existe uma sessão para o usuário. Nesse caso, o usuário é armazenado em
$rootScope
e considerado conectado. - Sempre que a rota AngularJS muda, o mesmo endpoint é acessado. A proteção de rota foi especificada de maneira semelhante à descrita aqui
. Se o endpoint retornar que não existe nenhuma sessão,
$rootScope.user
não está definido (se necessário) e o usuário é redirecionado para a página de login. - Quando o formulário de login é processado, ele é enviado para um terminal Express. O endpoint recupera o usuário do mongoDB (se existir) e tenta fazer o hash da senha. Se for uma correspondência, a sessão do usuário é definida, armazenada no mongo DB e o endpoint retorna o
user
objeto (usado para armazenar no $rootScope como mencionado anteriormente). - Sempre que outros endpoints são acessados, as funções são passadas primeiro pelo
restrict
função que garante que existe uma sessão antes de enviar quaisquer dados para o cliente. Ele retorna um401
se não existir nenhuma sessão, que é tratada no lado Angular usando este interceptador HTTP para desarmar$rootScope.user
e redirecionar para a tela de login. - Quando o usuário clica em "sair" no lado Angular, a sessão é desativada e excluída do banco de dados mongo,
$rootScope.user
é definido como nulo e o usuário é redirecionado de volta para a página inicial.