Eu já passei por isso com sled.com. Existem vários problemas aqui relacionados à criação de contas e ao suporte a várias contas de terceiros para login. Alguns deles são:
- Você precisa oferecer suporte a uma senha local e logins de terceiros?
No sled.com, decidi descartar a senha local devido ao pequeno valor agregado e ao custo adicional na proteção de um formulário de entrada de senha. Existem muitos ataques conhecidos para quebrar senhas e, se você quiser introduzir senhas, verifique se elas não são fáceis de quebrar. Você também precisa armazená-los em um hash unidirecional ou algo semelhante para impedir que eles vazem.
- Quanta flexibilidade você deseja permitir no suporte a várias contas de terceiros?
Parece que você já escolheu os três provedores de login: Facebook, Twitter e LinkedIn. Isso é ótimo porque significa que você está usando o OAuth e trabalhando com um conjunto bem definido de fornecedores confiáveis. Não sou fã do OpenID. A questão restante é se você precisa oferecer suporte a várias contas de terceiros do mesmo provedor (por exemplo, uma conta local com duas contas do Twitter vinculadas). Suponho que não, mas se você aceitar, precisará acomodar isso em seu modelo de dados.
Para o Sled, apoiamos o login com o Facebook, Twitter e Yahoo! e em cada conta de usuário, armazene uma chave para cada um: {"_id": "djdjd99dj", "yahoo": "dj39djdj", twitter: "3723828732", "facebook": "12837287"}. Configuramos várias restrições para garantir que cada conta de terceiros possa ser vinculada apenas a uma única conta local.
Se você deseja permitir várias contas do mesmo provedor, precisará usar listas ou outras estruturas para dar suporte a isso e, com isso, todas as outras restrições para garantir a exclusividade.
- Como vincular várias contas?
Na primeira vez em que o usuário se inscreve no seu serviço, ele primeiro acessa o provedor de terceiros e volta com uma identificação de terceiros verificada. Você, então, cria uma conta local para eles e coleta qualquer outra informação que desejar. Coletamos o endereço de e-mail e também pedimos que eles escolham um nome de usuário local (tentamos preencher previamente o formulário com o nome de usuário existente de outro provedor). Ter alguma forma de identificador local (email, nome de usuário) é muito importante para a recuperação da conta posteriormente.
O servidor sabe que esse é um primeiro login se o navegador não tiver um cookie de sessão (válido ou expirado) para uma conta existente e se a conta de terceiros usada não for encontrada. Tentamos informar ao usuário que eles não estão apenas efetuando login, mas estão criando uma nova conta para que, se já tiverem uma conta, esperemos pausar e fazer login com a conta existente.
Usamos exatamente o mesmo fluxo para vincular contas adicionais, mas quando o usuário volta de terceiros, a presença de um cookie de sessão válido é usada para diferenciar entre uma tentativa de vincular uma nova conta a uma ação de login. Permitimos apenas uma conta de terceiros de cada tipo e, se já houver uma vinculada, bloqueamos a ação. Não deve ser um problema porque a interface para vincular uma nova conta será desativada se você já tiver uma (por provedor), mas apenas por precaução.
Se um usuário tentar vincular uma nova conta de terceiros que já esteja vinculada a uma conta local, basta solicitar que eles confirmem que desejam mesclar as duas contas (supondo que você possa lidar com essa mesclagem com seu conjunto de dados - geralmente é mais fácil dizer do que feito). Você também pode fornecer a eles um botão especial para solicitar uma mesclagem, mas, na prática, tudo o que eles estão fazendo é vincular outra conta.
Esta é uma máquina de estado bastante simples. O usuário volta de terceiros com um ID de conta de terceiros. Seu banco de dados pode estar em um dos três estados:
- A conta está vinculada a uma conta local e nenhum cookie de sessão está presente -> Login
- A conta está vinculada a uma conta local e um cookie de sessão está presente -> Mesclar
- A conta não está vinculada a uma conta local e nenhum cookie de sessão está presente -> Inscrição
A conta não está vinculada a uma conta local e um cookie de sessão está presente -> Vinculando conta adicional
- Como executar a recuperação de contas com terceiros?
Este ainda é um território experimental. Não vi um UX perfeito para isso, pois a maioria dos serviços fornece uma senha local ao lado das contas de terceiros e, portanto, concentra-se no caso de uso "esqueci minha senha", nem em tudo o que pode dar errado.
Com o Sled, optamos por usar "Precisa de ajuda para fazer login?" e quando você clicar, peça ao usuário o email ou o nome de usuário. Procuramos em busca e, se encontrarmos uma conta correspondente, envie um e-mail para o usuário com um link que possa automaticamente registrá-lo no serviço (válido uma vez). Quando entramos, os levamos diretamente para a página de vinculação da conta, informamos que devem dar uma olhada e potencialmente vinculam contas adicionais e mostramos as contas de terceiros que já vincularam.