181 votes

Architecture pour fusionner plusieurs comptes d'utilisateurs 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? 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 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/

123voto

cheeken Points 9013

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 à un nombre quelconque de site tiers des 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.)

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:

  • Un utilisateur se connecte pour la première fois à l'aide d'un tiers d'identité. Une identité locale enregistrement est créé, puis une troisième partie de l'identité d'enregistrement, et puis ils sont jumelés.
  • Dans un panneau de commande, l'utilisateur se voit offrir la possibilité de lier un compte en ouvrant une session dans les services de tiers. (Assez simple de la façon dont cela fonctionne.)
  • Dans le scénario où l'utilisateur involontairement fait de multiples comptes, la solution est assez simple. Alors que l'utilisateur est connecté sur l'un des comptes, il se connecte à un autre qu'il avait utilisé pour se connecter sur le site (via le panneau de configuration ci-dessus). Le service web détecte la collision (que l'identité de l'utilisateur connecté diffère de l'identité locale est liée à la troisième partie de l'identité qui vient de se connecte) et l'utilisateur est invité à un compte de fusion.

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.

49voto

Max Alexander Points 776

J'ai tendance à trouver beaucoup de sites de fusion basé 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

  • Votre propre des membres du site
  • Connexion avec facebook
  • Connexion avec google

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.

 if the user logins using Facebook (or whatever 3rd party login)
      1) call the Facebook api asking for their information (email, name, etc...) 
      2) create an account membership entry in your database somewhat like this 

         Table = Users
         [ UserId   |       Email             | Password ]
         [    23     | "newuser@coolmail.com" |  *null*  ]

      3) create an external auths entry like so
         *ProviderUserId is the unique id of that user on the provider's site

         Table = ExternalAuths
         [ ExternalAuthId  |  User_UserId   | ProviderName |   ProviderUserId  ]
         [    56           |      23        |   Facebook   |  "max.alexander.9"]

 if the user wants to create an account with your own registration it would just be this           

         Table = Users
         [ UserId   |       Email           |   Password  ]
         [    23     | newuser@coolmail.com |  myCoolPwd  ]

2) À un autre moment, l'utilisateur revient mais décide de cliquer sur le Google Login

      1) call the Google api asking for their information (email, name, etc...) 

      2) once you get the email, match it up to the userId entry with the existing email 

      3) create an additional External auth entry as such

         Table = ExternalAuths
         [ ExternalAuthId  |  User_UserId   | ProviderName |   ProviderUserId  ]
         [    56           |      23        |   Facebook   |  "max.alexander.9"]
         [    57           |      23        |    Google    |  "1234854368"     ]

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.

Donc 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é.

35voto

Eran Hammer Points 2522

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:

  • Avez-vous besoin pour soutenir à la fois un mot de passe local et le tiers de connexions?

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.

  • Combien de flexibilité voulez-vous autoriser dans la prise en charge de plusieurs comptes de tiers?

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.

Pour 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é.

  • Comment lier plusieurs comptes?

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ù.

  • Comment fusionner des comptes?

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:

  1. Le compte est lié à un compte local et aucun cookie de session est --> Connexion
  2. Le compte est lié à un compte local et un cookie de session est présent --> Fusion
  3. Le compte n'est pas lié à une compte local et aucun cookie de session est présent --> Inscription
  4. L' compte n'est pas lié à un compte local et un cookie de session est --> les liens de compte Supplémentaire

    • Comment faire pour effectuer la récupération de compte avec des tiers fournisseurs?

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 de 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.

23voto

Brad J Points 121

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... 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.

-4voto

Neal Points 68710

Vous devez autoriser la connexion depuis un compte, puis, lorsque vous êtes connecté, vous pouvez ajouter un autre compte à fusionner avec celui-ci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X