J'ai vécu ça avec sled.com. Il y a plusieurs problèmes ici en ce qui concerne la création de comptes et la prise en charge de plusieurs comptes tiers pour la connexion. Certains d'entre eux sont:
- Avez-vous besoin de prendre en charge à la fois un mot de passe local et des connexions tierces?
Pour sled.com, j'ai décidé de supprimer le mot de passe local en raison de la faible valeur qu'il ajoute et du coût supplémentaire lié à la sécurisation d'un formulaire de saisie de mot de passe. Il existe de nombreuses attaques connues pour casser des mots de passe et si vous prévoyez d'introduire des mots de passe, vous devez vous assurer qu'ils ne sont pas faciles à casser. Vous devez également les stocker dans un hachage à sens unique ou quelque chose de similaire pour éviter qu'ils ne fuient.
- Quelle flexibilité souhaitez-vous autoriser pour prendre en charge plusieurs comptes tiers?
Il semble que vous ayez déjà choisi les trois fournisseurs de connexion: Facebook, Twitter et LinkedIn. C'est génial car cela signifie que vous utilisez OAuth et que vous travaillez avec un ensemble bien défini de fournisseurs de confiance. Je ne suis pas fan d'OpenID. La question restante est de savoir si vous devez prendre en charge plusieurs comptes tiers du même fournisseur (par exemple, un compte local avec deux comptes Twitter liés). Je suppose que non, mais si vous le faites, vous devrez intégrer cela dans votre modèle de données.
Pour Sled, nous prenons en charge la connexion avec Facebook, Twitter et Yahoo! et dans chaque compte utilisateur, stockez une clé pour chacun: {"_id": "djdjd99dj", "yahoo": "dj39djdj", twitter: "3723828732", "facebook": "12837287"}. Nous avons mis en place un certain nombre de contraintes pour nous assurer que chaque compte tiers ne peut être lié qu'à un seul compte local.
Si vous prévoyez d'autoriser plusieurs comptes du même fournisseur tiers, vous devrez utiliser des listes ou d'autres structures pour prendre en charge cela, et avec cela, toutes les autres restrictions pour garantir l'unicité.
- Comment lier plusieurs comptes?
La première fois que l'utilisateur s'inscrit à votre service, il se rend d'abord chez le fournisseur tiers et revient avec un identifiant tiers vérifié. Vous créez ensuite un compte local pour eux et collectez toutes les autres informations que vous souhaitez. Nous recueillons leur adresse e-mail et leur demandons également de choisir un nom d'utilisateur local (nous essayons de pré-remplir le formulaire avec leur nom d'utilisateur existant de l'autre fournisseur). Avoir une certaine forme d'identifiant local (e-mail, nom d'utilisateur) est très important pour la récupération du compte plus tard.
Le serveur sait qu'il s'agit d'une première connexion si le navigateur n'a pas de cookie de session (valide ou expiré) pour un compte existant et que le compte tiers utilisé n'est pas trouvé. Nous essayons d'informer l'utilisateur qu'il ne se connecte pas simplement, mais qu'il crée un nouveau compte afin que s'il a déjà un compte, il se mettra en pause et se connectera avec son compte existant à la place.
Nous utilisons exactement le même flux pour lier des comptes supplémentaires, mais lorsque l'utilisateur revient du tiers, la présence d'un cookie de session valide est utilisée pour différencier une tentative de lier un nouveau compte à une action de connexion. Nous n'autorisons qu'un seul compte tiers de chaque type et s'il y en a déjà un lié, bloquez l'action. Cela ne devrait pas poser de problème car l'interface pour lier un nouveau compte est désactivée si vous en avez déjà un (par fournisseur), mais juste au cas où.
- Comment fusionner des comptes?
Si un utilisateur tente de lier un nouveau compte tiers déjà lié à un compte local, vous lui demandez simplement de confirmer qu'il souhaite fusionner les deux comptes (en supposant que vous puissiez gérer une telle fusion avec votre ensemble de données - souvent plus facile à dire que fait). Vous pouvez également leur fournir un bouton spécial pour demander une fusion, mais en pratique, tout ce qu'ils font est de lier un autre compte.
C'est une machine à états assez simple. L'utilisateur revient du tiers avec un identifiant de compte tiers. Votre base de données peut être dans l'un des trois états suivants:
- Le compte est lié à un compte local et aucun cookie de session n'est présent -> Connexion
- Le compte est lié à un compte local et un cookie de session est présent -> Fusionner
- Le compte n'est pas lié à un compte local et aucun cookie de session n'est présent -> Inscription
Le compte n'est pas lié à un compte local et un cookie de session est présent -> Lier un compte supplémentaire
- Comment effectuer la récupération de compte avec des fournisseurs tiers?
C'est encore un territoire expérimental. Je n'ai pas vu une expérience utilisateur parfaite pour cela, car la plupart des services fournissent à la fois un mot de passe local à côté des comptes tiers et se concentrent donc sur le cas d'utilisation "oublié mon mot de passe", pas sur tout ce qui peut mal tourner.
Avec Sled, nous avons choisi d'utiliser "Besoin d'aide pour vous connecter?" et lorsque vous cliquez, demandez à l'utilisateur son adresse e-mail ou son nom d'utilisateur. Nous recherchons et si nous trouvons un compte correspondant, envoyez à cet utilisateur un lien qui peut automatiquement le connecter au service (bon pour une fois). Une fois arrivés, nous les dirigeons directement vers la page d'association de comptes, leur disons qu'ils devraient jeter un coup d'œil et éventuellement associer des comptes supplémentaires, et leur montrer les comptes tiers qu'ils ont déjà liés.