Okay, ich habe eine Website, auf der Sie sich registrieren und anmelden können. Sie können sich auch mit Ihrem Facebook-, Twitter- oder Linkedin-Konto anmelden.
Es ist wichtig, dass Benutzer nur ein Konto registriert haben. Irgendwie möchte ich die Konten von Benutzern zusammenführen, wenn diese unterschiedliche Methoden zum Anmelden verwenden. Was ist die beste Lösung, um dies zu lösen?
Beispielsweise meldet sich der Benutzer mit seinem Facebook-Konto an. Ich benutze die Daten, um automatisch ein Konto für ihn zu registrieren. Soll ich eine E-Mail mit einem Benutzernamen und einem Passwort unserer Website senden? (Wenn dies mit der Politik von Facebook in Ordnung ist). Soll ich ihnen einen zweiten Bildschirm geben, auf dem sie einen Benutzernamen und ein Passwort eingeben können? Aber das ist nicht die Idee, sich mit Ihrem Facebook-Konto anzumelden. Es sollte Ihr Verfahren zur Teilnahme vereinfachen.
Es ist auch möglich, dass sich der Benutzer auf unserer Website registriert hat und sich das nächste Mal mit seinem Twitter-Konto anmeldet. Wie kann ich diese beiden Konten zu einem zusammenführen? Was ist der beste Weg?
Meine Frage lautet also im Grunde: Ich habe 4 verschiedene Möglichkeiten, wie ein Benutzer Mitglied unserer Website wird. Wie kann ich sicherstellen, dass alle diese vier Möglichkeiten nur ein Konto erstellen, wenn ein Benutzer mehrere Möglichkeiten verwendet? Was ist der beste Ablauf, um sicherzustellen, dass der Benutzer selbst keinen Ärger bekommt?
Bearbeiten:
3 Jahre nachdem ich diese Frage gestellt habe, gebe ich die Antwort selbst in einer Reihe von Artikeln:
https://www.peternijssen.nl/social-network-authentication-setup/
https://www.peternijssen.nl/social- Netzwerkauthentifizierung-Google /
https://www.peternijssen.nl/social-network-authentication-merging-accounts/
https://www.peternijssen.nl/social-network-authentication-twitter-facebook/
Antworten:
Ich stehe im Moment vor genau der gleichen Aufgabe. Das Design, das ich ausgearbeitet habe, ist ziemlich einfach, aber es funktioniert gut.
Die Kernidee besteht darin, dass Modelle für eine lokale Site-Identität und die Site-Identitäten von Drittanbietern isoliert bleiben, aber später verknüpft werden. Jeder Benutzer, der sich auf der Site anmeldet, verfügt über eine lokale Identität, die einer beliebigen Anzahl von Site-Identitäten von Drittanbietern zugeordnet ist.
Ein lokaler Identitätsdatensatz enthält ein Minimum an Informationen - es kann sich sogar um ein einzelnes Feld handeln - nur einen Primärschlüssel. (Bei meiner Bewerbung ist mir die E-Mail-Adresse, der Name oder das Geburtsdatum des Benutzers egal. Ich möchte nur wissen, dass es sich um die Person handelt, die sich die ganze Zeit in diesem Konto angemeldet hat.)
Die Identitäten von Drittanbietern enthalten Informationen, die nur für die Authentifizierung bei einem Drittanbieter relevant sind. Für OAuth bedeutet dies normalerweise eine Benutzerkennung (wie eine ID, eine E-Mail oder ein Benutzername) und eine Dienstkennung (die angibt, mit welcher Site oder welchem Dienst authentifiziert wurde). In anderen Teilen der Anwendung außerhalb der Datenbank wird diese Dienstkennung mit einer Methode zum Abrufen der relevanten Benutzerkennung von diesem Dienst gepaart, und auf diese Weise wird die Authentifizierung durchgeführt. Für OpenID verwenden wir denselben Ansatz, außer dass die Authentifizierungsmethode allgemeiner ist (da wir fast immer genau dasselbe Protokoll ausführen können - außer dass wir eine andere Identitäts-URL verwenden und dies unsere Service-ID ist).
Schließlich führe ich Aufzeichnungen darüber, welche Identitäten von Drittanbietern mit welcher lokalen Identität gepaart sind. Um diese Datensätze zu generieren, sieht der Ablauf folgendermaßen aus:
Beim Zusammenführen von Konten müssen Sie jedes einzelne Feld der lokalen Identität zusammenführen (was von Anwendung zu Anwendung unterschiedlich ist und einfach sein sollte, wenn Ihre lokalen Identitätsdatensätze nur einige Felder enthalten) und anschließend die verknüpften Identitäten von Drittanbietern sicherstellen sind mit der resultierenden lokalen Identität verknüpft.
quelle
Ich neige dazu, viele Websites zu finden, die basierend auf E-Mail als überlappendem Verbindungsfaktor zusammengeführt werden.
Ich kann sehen, dass dies eine praktikable Option ist, aber auch hier hängt es von Ihrer Präferenz ab, wie Sie zusammenführen möchten. Die E-Mail-Adresse ist die Hauptmethode, mit der Benutzer wichtige Informationen auf Ihrer Website überprüfen, z. B. das Ändern Ihres Passworts, die Beendigung des Dienstes, den niedrigen Kontostand usw. Es ist fast wie das Sozialversicherungsnummernsystem des Webs, jedoch mit der Fähigkeit zur Kommunikation . Kulturell: Ich denke, es ist vernünftig anzunehmen, dass eine E-Mail eine ziemlich eindeutige Identität für alle OAuth-Authentifizierungsdienste ist. Zugegeben, es ist das, was die Anmeldeformulare für Facebook und Google verlangen.
Mein aktueller Denkprozess.
Die Anmeldeseite bietet 3 Optionen
1) Benutzeranmeldungen zum ersten Mal: Lösen Sie einen Registrierungsablauf aus, in dem ein Konto erstellt und zum ersten Mal ausgefüllt wird.
2) Zu einem anderen Zeitpunkt kommt der Nutzer zurück, beschließt jedoch, auf das Google-Login zu klicken
3) Jetzt haben Sie das Konto zusammengeführt, dem Sie vertrauen, dass die E-Mail in Ihren Datenbankeinträgen mit denen übereinstimmt, denen Sie bei den externen Anmeldungen vertrauen.
Also für nachfolgende Anmeldungen
Was ist, wenn Sie zuerst externe Anmeldungen haben und dann möchten, dass sich ein Benutzer später mit einem Kennwort anmelden kann?
Ich sehe zwei einfache Möglichkeiten, dies zu tun
Fragen Sie bei jeder ersten Anmeldung, wenn ein Konto über eine externe Authentifizierung erstellt wird, nach einem Kennwort, um den ersten Eintrag in Ihre Anwendung abzuschließen
Wenn sie sich bereits zuerst über Facebook oder Google registriert haben, wollten sie sich irgendwie über das Registrierungsformular Ihrer eigenen Website registrieren. Ermitteln Sie, ob die von ihnen eingegebene E-Mail-Adresse bereits vorhanden ist, fragen Sie sie nach einem Passwort und senden Sie ihnen nach Abschluss der Registrierung eine E-Mail-Bestätigung.
quelle
Ich habe das mit sled.com durchgemacht. Hier gibt es mehrere Probleme beim Erstellen von Konten und beim Unterstützen mehrerer Konten von Drittanbietern für die Anmeldung. Einige von ihnen sind:
Für sled.com habe ich beschlossen, das lokale Passwort aufgrund des geringen Mehrwerts und der zusätzlichen Kosten für die Sicherung eines Passworteingabeformulars zu löschen. Es gibt viele bekannte Angriffe zum Brechen von Passwörtern. Wenn Sie Passwörter einführen möchten, müssen Sie sicherstellen, dass diese nicht leicht zu knacken sind. Sie müssen sie auch in einem One-Way-Hash oder ähnlichem speichern, um zu verhindern, dass sie auslaufen.
Anscheinend haben Sie bereits die drei Anmeldeanbieter ausgewählt: Facebook, Twitter und LinkedIn. Das ist großartig, weil Sie OAuth verwenden und mit einer genau definierten Gruppe vertrauenswürdiger Anbieter zusammenarbeiten. Ich bin kein Fan von OpenID. Die verbleibende Frage ist, ob Sie mehrere Drittanbieter-Konten desselben Anbieters unterstützen müssen (z. B. ein lokales Konto mit zwei verknüpften Twitter-Konten). Ich gehe davon aus, dass dies nicht der Fall ist, aber wenn Sie dies tun, müssen Sie dies in Ihrem Datenmodell berücksichtigen.
Für Sled unterstützen wir die Anmeldung mit Facebook, Twitter und Yahoo! und in jedem Benutzerkonto einen Schlüssel für jeden speichern: {"_id": "djdjd99dj", "yahoo": "dj39djdj", twitter: "3723828732", "facebook": "12837287"}. Wir richten eine Reihe von Einschränkungen ein, um sicherzustellen, dass jedes Konto eines Drittanbieters nur mit einem einzelnen lokalen Konto verknüpft werden kann.
Wenn Sie mehrere Konten von demselben Drittanbieter zulassen möchten, müssen Sie Listen oder andere Strukturen verwenden, um dies zu unterstützen, und damit alle anderen Einschränkungen, um die Eindeutigkeit sicherzustellen.
Wenn sich der Benutzer zum ersten Mal für Ihren Dienst anmeldet, geht er zuerst zum Drittanbieter und gibt eine verifizierte Drittanbieter-ID zurück. Anschließend erstellen Sie ein lokales Konto für sie und sammeln alle anderen gewünschten Informationen. Wir erfassen ihre E-Mail-Adresse und bitten sie, einen lokalen Benutzernamen auszuwählen (wir versuchen, das Formular mit dem vorhandenen Benutzernamen des anderen Anbieters vorab auszufüllen). Eine spätere lokale Kennung (E-Mail, Benutzername) ist für die spätere Wiederherstellung des Kontos sehr wichtig.
Der Server weiß, dass dies eine erstmalige Anmeldung ist, wenn der Browser kein Sitzungscookie (gültig oder abgelaufen) für ein vorhandenes Konto hat und das verwendete Drittanbieter-Konto nicht gefunden wird. Wir versuchen, den Benutzer darüber zu informieren, dass er sich nicht nur anmeldet, sondern ein neues Konto erstellt, sodass er hoffentlich pausiert und sich stattdessen mit seinem vorhandenen Konto anmeldet, wenn er bereits ein Konto hat.
Wir verwenden genau denselben Ablauf, um zusätzliche Konten zu verknüpfen. Wenn der Benutzer jedoch von einem Drittanbieter zurückkommt, wird das Vorhandensein eines gültigen Sitzungscookies verwendet, um zwischen dem Versuch, ein neues Konto mit einer Anmeldeaktion zu verknüpfen, zu unterscheiden. Wir erlauben nur ein Drittanbieter-Konto für jeden Typ. Wenn bereits ein Konto verknüpft ist, blockieren Sie die Aktion. Dies sollte kein Problem sein, da die Schnittstelle zum Verknüpfen eines neuen Kontos deaktiviert ist, wenn Sie bereits eines haben (pro Anbieter), aber nur für den Fall.
Wenn ein Benutzer versucht hat, ein neues Drittanbieter-Konto zu verknüpfen, das bereits mit einem lokalen Konto verknüpft ist, fordern Sie ihn einfach auf, zu bestätigen, dass er die beiden Konten zusammenführen möchte (vorausgesetzt, Sie können eine solche Zusammenführung mit Ihrem Datensatz durchführen - oft einfacher gesagt als getan). Sie können ihnen auch eine spezielle Schaltfläche zum Anfordern einer Zusammenführung bereitstellen. In der Praxis müssen sie jedoch nur ein anderes Konto verknüpfen.
Dies ist eine ziemlich einfache Zustandsmaschine. Der Benutzer kommt mit einer Konto-ID eines Drittanbieters vom Drittanbieter zurück. Ihre Datenbank kann sich in einem von drei Zuständen befinden:
Das Konto ist nicht mit einem lokalen Konto verknüpft und es ist ein Sitzungscookie vorhanden -> Zusätzliches Konto verknüpfen
Dies ist immer noch experimentelles Gebiet. Ich habe kein perfektes UX dafür gesehen, da die meisten Dienste neben den Konten von Drittanbietern sowohl ein lokales Kennwort bereitstellen als auch sich auf den Anwendungsfall "Passwort vergessen" konzentrieren und nicht auf alles andere, was schief gehen kann.
Bei Sled haben wir uns für "Benötigen Sie Hilfe beim Anmelden?" Wenn Sie auf klicken, fragen Sie den Benutzer nach seiner E-Mail-Adresse oder seinem Benutzernamen. Wir suchen nach und wenn wir ein passendes Konto finden, senden Sie diesem Benutzer eine E-Mail mit einem Link, über den er sich automatisch beim Dienst anmelden kann (einmalig gültig). Sobald sie eingegangen sind, führen wir sie direkt zur Seite zum Verknüpfen von Konten, teilen ihnen mit, dass sie einen Blick darauf werfen und möglicherweise zusätzliche Konten verknüpfen sollen, und zeigen ihnen die Konten von Drittanbietern, die sie bereits verknüpft haben.
quelle
Beide Ansätze für das automatische Zusammenführen von Konten hinterlassen eine ziemlich große Sicherheitslücke, die es jemandem ermöglichen würde, ein Konto zu übernehmen. Beide scheinen davon auszugehen, dass der Benutzer der ist, für den sie sich ausgeben, wenn sie einem registrierenden Benutzer die Zusammenführungsoption anbieten.
Meine Empfehlung zur Minderung der Sicherheitsanfälligkeit besteht darin, den Benutzer vor der Zusammenführung zur Authentifizierung bei einem der bekannten Identitätsanbieter anzufordern, um die Identität des Benutzers zu überprüfen.
Beispiel: Benutzer A registriert sich mit Facebook-Identität. Einige Zeit später kehren sie zu Ihrer Site zurück und versuchen, mit Windows Live ID darauf zuzugreifen und den Registrierungsprozess zu starten. Ihre Website fordert Benutzer A auf mit ... Es sieht so aus, als hätten Sie sich zuvor bei Facebook registriert. Bitte melden Sie sich mit Facebook an (Link angeben) und wir können Ihre Windows Live ID mit Ihrem vorhandenen Profil zusammenführen.
Eine andere Alternative besteht darin, ein gemeinsames Geheimnis (Passwort / persönliche Frage) bei der Erstregistrierung zu speichern, das der Benutzer beim Zusammenführen von Identitäten angeben muss. Dies bringt Sie jedoch wieder in das Geschäft des Speicherns gemeinsamer Geheimnisse. Dies bedeutet auch, dass Sie das Szenario behandeln müssen, in dem sich der Benutzer nicht an das gemeinsame Geheimnis und den damit verbundenen Workflow erinnert.
quelle
Die meisten Beiträge sind ziemlich alt und ich denke, Googles kostenloser Firebase-Authentifizierungsdienst gab es noch nicht. Nach der Überprüfung mit OAuth übergeben Sie das OAuth-Token an es und erhalten eine eindeutige Benutzer-ID, die Sie als Referenz speichern können. Unterstützte Anbieter sind Google, Facebook, Twitter, GitHub und es besteht die Möglichkeit, benutzerdefinierte und anonyme Anbieter zu registrieren.
quelle
Tolle Antworten und Ressourcen oben. Mein Beitrag ist hier zusammengefasst ... https://github.com/JavascriptMick/learntree.org/blob/master/design/Schema.md
TLDR: Separate Konto- und Personenschemata. 2 Varianten von Account, Email und OAuth.
Konto -authenticates-> Person
quelle
Sie sollten die Anmeldung von einem Konto aus zulassen. Wenn Sie angemeldet sind, können Sie ein anderes Konto hinzufügen, um es zusammenzuführen.
quelle