L'Architecture de la fusion de plusieurs comptes d'utilisateur ensemble
Ok, j'ai un site web où vous pouvez vous inscrire et connectez-vous. Vous pouvez également vous connecter avec votre facebook, twitter ou linkedin compte.
Il est important que les utilisateurs ont seulement un compte enregistré. Donc, en quelque sorte, je veux fusionner les comptes des utilisateurs si elles utilisent différentes méthodes pour vous connecter. Quelle est la meilleure solution pour résoudre cela?
Par exemple, l'utilisateur se connecte avec son Facebook compte. J'utilise les données à enregistrer un compte pour lui automatiquement. Dois-je envoyé un e-mail avec un nom d'utilisateur et le mot de passe de notre site web? (Si ce n'est d'accord avec la politique de Facebook). Dois-je leur donner un second écran où ils peuvent remplir un nom d'utilisateur et le mot de passe? Mais ce n'est pas l'idée de vous connecter avec votre Facebook compte. Il faut la simplifier votre procédure pour participer.
Il est également possible que l'utilisateur a enregistré lui-même sur notre site web et la prochaine fois qu'il se connecte avec son compte twitter. Comment puis-je fusionner ces 2 comptes comme l'une? Quelle est la meilleure façon?
Donc en gros ma question est: j'ai eu 4 façons différentes de l'utilisateur devient membre de notre site web. Comment puis-je m'assurer que l'ensemble de ces 4 manières de créer un compte si un utilisateur décide d'utiliser de multiples façons? Quel est le meilleur débit pour s'assurer qu'il ne devienne pas une corvée pour l'utilisateur lui-même?
Edit:
3 ans après que j'ai posé cette question, je donne la réponse moi-même dans une série d'articles: http://www.sitepoint.com/series/using-social-networks-as-a-login-system/
- Bien sûr, il est préférable d'essayer d'empêcher un utilisateur d'avoir plusieurs comptes, en premier lieu, en permettant à plusieurs méthodes d'authentification comme un Débordement de Pile, mais même a DONC la possibilité pour les modérateurs de fusionner des comptes. Je vous propose de bounty pour n'importe qui qui peut décrire une architecture pour permettre cela. Il y a à être une meilleure solution que de "mettre à jour le post UserID = 2 where UserID = 1"
- l'email et le téléphone peut être utilisé comme clé de la fusion, toutes les autres?
Vous devez vous connecter pour publier un commentaire.
Je suis confronté exactement la même tâche pour le moment. La conception que j'ai travaillé est plutôt simple, mais il fonctionne bien.
L'idée de base est que les modèles pour un site local de l'identité et du site tiers identités sont maintenus isolés, mais sont lié par la suite. Ainsi, chaque utilisateur qui ouvre une session dans le site dispose d'une identité locale qui correspond à n'importe quel nombre de sites web de tiers identités.
Une identité locale enregistrement contient un minimum d'informations, il pourrait même être un seul champ - juste une clé primaire. (Pour mon application, je ne se soucient pas de l'email de l'utilisateur, le nom ou la date de naissance - je veux juste savoir qu'ils sont la personne qui a été la journalisation à ce type de compte tout le long.)
Les identités des tiers contiennent de l'information pertinente pour l'authentification avec un tiers. Pour OAuth, cela signifie généralement un identifiant utilisateur (comme un id, e-mail ou nom d'utilisateur) et un identificateur de service (ce qui indique que le site ou le service a été authentifié avec). Dans d'autres parties de l'application, à l'extérieur de la base de données, que l'identificateur de service est couplé avec une méthode de récupération de l'utilisateur concerné, de l'identificateur de service, et c'est la manière dont l'authentification est effectuée. Pour OpenID, nous utilisons la même approche, à l'exception de la méthode d'authentification est plus généralisée (parce que nous pouvons presque toujours effectuer exactement le même protocole, sauf que nous utilisons une identité différente de l'URL, et c'est notre identificateur de service).
Enfin, je garde un dossiers de tiers qui identités sont jumelés à ce que l'identité locale. Pour générer ces dossiers, le débit ressemble à ceci:
La fusion de comptes est une question de fusion de chacun des champs de l'identité locale (qui varient d'une application à l'autre, et devrait être facile si vous avez seulement un couple de champs de votre identité locale records), et d'assurer liées aux identités des tiers sont liés à la résultante de l'identité locale.
email
puis avecfacebook
wouldnt local compte de la redondance?J'ai tendance à trouver beaucoup de sites de fusion basée sur e-mail, comme le cumul de rejoindre facteur.
Je peux voir ce qui est une option viable, mais encore, cela dépend de vos préférences sur la façon de fusionner. Adresse e-mail est le principal moyen que les gens utilisent pour vérifier certaines informations importantes changement sur votre site comme, de changer votre mot de passe, à la cessation de service, le solde du compte est faible, etc... C'est presque comme le web, le numéro de sécurité sociale du système, mais avec la capacité de communication. Culturellement: je pense qu'il est raisonnable de supposer qu'un email est une assez unique de l'identité à travers l'authentification OAuth services. Certes, c'est ce que les formulaires de login de Facebook et de Google, demander.
Mon processus de pensée.
La page de connexion a 3 options
1) les connexions de l'Utilisateur pour la première fois: déclencher un enregistrement de flux où un compte est créé et rempli pour la première fois.
2) À un autre moment, l'utilisateur revient mais décide de cliquer sur le Google Login
3) Maintenant que vous avez fusionné sur le compte que vous faites confiance à l'e-mail sur votre base de données d'entrées sont les mêmes que ceux en qui vous avez confiance de l'extérieur par les ouvertures de session.
Ainsi que pour les connexions ultérieures
Alors que faire si vous avez des connexions externes en premier et ensuite vous voulez qu'un utilisateur capable de se connecter avec un mot de passe plus tard?
Je vois deux façons simples de le faire
Sur la toute première connexion lorsqu'un compte est créé à partir d'un auth externe, de leur demander un mot de passe pour effectuer leur première entrée dans votre application
Si ils ont déjà enregistré à l'aide de facebook ou de google d'abord, puis voulais en quelque sorte de s'inscrire en utilisant votre propre formulaire d'inscription du site. Détecter si l'adresse e-mail, ils sont entrés existe déjà, de leur demander un mot de passe, et de leur envoyer un e-mail de confirmation après l'enregistrement soit terminé.
J'ai vécu cela avec sled.com. Il existe de multiples problèmes ici en ce qui concerne la création des comptes et de la prise en charge de plusieurs comptes de tiers pour la connexion. Certains d'entre eux sont:
Pour sled.com j'ai décidé de laisser tomber le mot de passe locaux en raison de la petite valeur qu'il ajoute un coût supplémentaire dans l'obtention d'un mot de passe formulaire de participation. Il existe de nombreuses attaques connues pour casser les mots de passe et si vous allez introduire des mots de passe, vous devez vous assurer qu'ils ne sont pas facile à briser. Vous avez également besoin de les stocker dans un one-way hash ou quelque chose de similaire pour empêcher leur fuite.
Il sonne comme vous avez déjà choisi les trois fournisseurs de connexion: Facebook, Twitter, et LinkedIn. C'est excellent, car cela signifie que vous êtes en utilisant OAuth et de travailler avec un ensemble bien défini de fournisseurs de confiance. Je ne suis pas fan de OpenID. La question qui reste est de savoir si vous avez besoin de prendre en charge plusieurs comptes de tiers à partir 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 aurez besoin de les accueillir dans votre modèle de données.
De Traîneau, nous soutenons la connexion avec Facebook, Twitter et Yahoo! et au sein de chaque compte d'utilisateur de stocker une clé pour chacun d'eux: { "_id":"djdjd99dj", "yahoo":"dj39djdj",twitter:"3723828732","facebook":"12837287"}. On a mis en place un tas de contraintes pour s'assurer que chaque compte tiers ne peut être liée qu'à un seul compte local.
Si vous allez permettre à plusieurs comptes du même fournisseur tiers, vous aurez besoin d'utiliser des listes ou d'autres structures de soutien, et avec cela, toutes les autres restrictions afin d'assurer l'unicité.
La première fois que l'utilisateur se connecte à votre service, ils ont d'abord aller à un fournisseur tiers et revenir avec un vérifiées par tierce partie id. Ensuite, vous créez un compte local pour eux et de recueillir toutes les informations que vous souhaitez. Nous recueillons leur adresse e-mail et leur demander 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 locale identifiant (adresse email, nom d'utilisateur) est très important pour la récupération de compte plus tard.
Le serveur sait que c'est un premier temps de connexion si le navigateur n'avez pas un cookie de session (valide ou expiré) pour un compte existant, et que le tiers compte utilisé n'est pas trouvé. Nous essayons d'informer l'utilisateur qu'ils ne sont pas seulement d'enregistrement, mais la création d'un nouveau compte, de sorte que si ils ont déjà un compte, qu'ils vont mettre en pause et de se connecter avec leur compte existant au lieu.
Nous utilisons exactement le même flux pour ajouter d'autres comptes, mais lorsque l'utilisateur revient à partir de la troisième partie, la présence d'un valide cookie de session est utilisé pour faire la distinction entre une tentative de lier un nouveau compte pour une action login. Nous n'autorisons qu'un seul compte tiers de chaque type et si il est déjà lié, de bloquer l'action. Il ne devrait pas être un problème parce que l'interface de lier un nouveau compte est désactivé si vous avez déjà un (par le fournisseur), mais juste au cas où.
Si un utilisateur a tenté de lier un nouveau compte tiers qui est déjà lié à un compte local, vous devez simplement vous invite à confirmer qu'ils veulent fusionner les deux comptes (en supposant que vous pouvez gérer un tel fusionner avec votre jeu de données - souvent plus facile à dire qu'à faire). Vous pouvez également leur donner une touche spéciale à la demande d'une fusion, mais dans la pratique, ils sont tous en train de faire est de relier un autre compte.
C'est une bien jolie machine d'état. L'utilisateur revient à partir de la troisième partie à un tiers l'id de compte. Votre base de données peut être dans l'un des trois états suivants:
présent --> Login
cookie de session est présent --> Fusionner
compte local et aucun cookie de session est présent --> Inscription
L'
compte n'est pas lié à un compte local et un cookie de session est
présent --> Liaison de compte Supplémentaire
C'est encore expérimental territoire. Je n'ai pas vu un parfait UX pour ce que la plupart des services de fournir à la fois un mot de passe local à côté pour les comptes de tiers et, par conséquent, se concentrer sur le "j'ai oublié mon mot de passe" cas d'utilisation, pas tout ce qui peut aller mal.
Avec Traîneau, nous avons opté pour l'utilisation de "Besoin d'aide pour connecter?" et lorsque vous cliquez sur, demander à l'utilisateur de leur e-mail ou nom d'utilisateur. On en cherche et si nous trouvons un compte correspondant, e-mail que l'utilisateur un lien qui peut se connecter automatiquement dans le service (pour une fois). Une fois dedans, nous amène directement sur le compte de liaison de la page, dites-leur qu'ils devraient prendre un coup d'oeil et éventuellement d'autres comptes, et de leur montrer que les comptes de tiers qu'ils ont déjà liés.
Les deux approches pour l'auto fusion de comptes laisse une assez grande vulnérabilité qui permettent à quelqu'un de prendre un compte. Ils ont tous deux semblent faire l'hypothèse que l'utilisateur est en fait qui ils disent qu'ils sont quand ils offrent l'option fusionner pour une inscription de l'utilisateur.
Ma recommandation pour la réduction de la vulnérabilité consiste à demander à l'utilisateur de s'authentifier avec l'un des Fournisseurs d'Identité avant de procéder à la fusion de vérifier l'identité de l'utilisateur.
Exemple: Un Utilisateur inscrit avec Facebook identité. Quelque temps plus tard, ils vont revenir à votre site et de tenter d'accéder à Windows Live ID et de commencer le processus d'inscription. Votre site va demander à l'Utilisateur Une avec... On dirait que vous avez enregistré avec Facebook précédemment. Veuillez vous connecter avec Facebook (lien) et on peut les fusionner votre identifiant Windows Live ID avec votre profil existant.
Une autre alternative est de stocker un secret partagé(mot de passe/question personnelle) sur l'enregistrement initial que l'utilisateur doit fournir lors de la fusion d'identités, cependant cela vous arrive dans l'entreprise de stockage de secrets partagés. Cela signifie également que vous avez à gérer le scénario où l'utilisateur ne se rappelle pas le secret partagé et le travail qui va avec.
La plupart des emplois sont assez vieux et je suppose que Google est gratuit Firebase Authentification service n'est pas encore partout. Après vérification avec OAuth, vous passer le jeton OAuth et obtenir un identifiant d'utilisateur unique qui vous pouvez stocker des fins de référence. Pris en charge les fournisseurs sont Google, Facebook, Twitter, GitHub et il y a une option pour enregistrer personnalisée et anonyme fournisseurs.
De grandes réponses et les ressources ci-dessus. Ma contribution est résumée ici... https://github.com/JavascriptMick/learntree.org/blob/master/design/Schema.md
TLDR: ventilation du Compte et Personne schémas. 2 variantes de Compte, e-Mail et OAuth.
Compte -authentification-> Personne
Vous devez autoriser la connexion depuis un compte, puis lorsque vous êtes connecté lui donne la possibilité d'ajouter différents autres compte de fusionner avec elle.