Birden çok kullanıcı hesabını bir araya getirmek için mimari


176

Tamam, kendinizi kaydedebileceğiniz ve giriş yapabileceğiniz bir web sitem var. Ayrıca facebook, twitter veya Linkedin hesabınızla giriş yapabilirsiniz.

Kullanıcıların yalnızca bir hesabının kayıtlı olması önemlidir. Bir şekilde, giriş yapmak için farklı yöntemler kullanıyorlarsa kullanıcıların hesaplarını birleştirmek istiyorum. Bunu çözmek için en iyi çözüm nedir?

Örneğin, kullanıcı Facebook hesabıyla oturum açar. Verileri otomatik olarak bir hesap açmak için kullanıyorum. Web sitemizin kullanıcı adı ve şifresi ile bir e-posta göndermeli miyim? (Bu Facebook politikası ile sorun değilse). Onlara bir kullanıcı adı ve şifre girebilecekleri ikinci bir ekran vermeli miyim? Ancak Facebook hesabınızla giriş yapmanın ardındaki fikir bu değil. Katılma prosedürünüzü basitleştirmelidir.

Kullanıcının web sitemizde kendini kaydetmesi ve bir dahaki sefere twitter hesabıyla oturum açması da mümkündür. Bu 2 hesabı bir hesap olarak nasıl birleştirebilirim? En iyi yol nedir?

Temelde sorum şu: Bir kullanıcının web sitemize üye olması için 4 farklı yolum var. Bir kullanıcı birden çok yol kullanmaya karar verirse, bu 4 yolun hepsinin yalnızca bir hesap oluşturduğundan nasıl emin olabilirim? Kullanıcının kendisi için bir güçlük haline gelmemesini sağlamak için en iyi akış nedir?


Düzenle:

Bu soruyu sorduktan 3 yıl sonra, cevabı kendime bir dizi makalede veriyorum: https://www.peternijssen.nl/social-network-authentication-setup/
https://www.peternijssen.nl/social- network-authentication-google /
https://www.peternijssen.nl/social-network-authentication-merging-accounts/
https://www.peternijssen.nl/social-network-authentication-twitter-facebook/


7
Tabii ki, bir kullanıcının Stack Overflow gibi çoklu giriş yöntemlerine izin vererek ilk etapta birden fazla hesaba sahip olmasını önlemeye çalışmak en iyisidir, ancak SO bile moderatörlerin hesapları birleştirebilme yeteneğine sahiptir. Buna izin vermek için bir mimariyi tarif edebilen herkese ödül teklif ediyorum. "UserID = 1 olduğunda güncelleme kullanıcısı set UserID = 2" den daha iyi bir çözüm olmalıdır
David Boike

e-posta ve telefon birleştirme anahtarı olarak kullanılabilir, diğerleri?
Wuaner

Merhaba, sağladığınız bağlantı çalışmıyor. Sadece site ana sayfasına gider
vigamage

Bağlantılar güncellendi. Makaleler 6 yaşında olsa da.
PT

Yanıtlar:


120

Şu anda aynı görevle karşı karşıyayım. Çalıştığım tasarım oldukça basit, ama iyi çalışıyor.

Ana fikir, yerel bir site kimliği ve üçüncü taraf site kimlikleri için modellerin yalıtılmış tutulması, ancak daha sonra bağlantılı olmalarıdır. Bu nedenle, siteye giriş yapan her kullanıcının, herhangi bir sayıda üçüncü taraf site kimliğiyle eşleşen yerel bir kimliği vardır.

Yerel kimlik kaydı minimum bilgi içerir - tek bir alan bile olabilir - sadece birincil anahtardır. (Başvurum için, kullanıcının e-postasını, adını veya doğum tarihini umursamıyorum - sadece bu hesaba giriş yapan kişi olduklarını bilmek istiyorum.)

Üçüncü taraf kimlikleri yalnızca bir üçüncü tarafla kimlik doğrulamasıyla ilgili bilgiler içerir. OAuth için bu genellikle bir kullanıcı tanımlayıcısı (kimlik, e-posta veya kullanıcı adı gibi) ve bir hizmet tanımlayıcısı (hangi sitenin veya hizmetin kimliğinin doğrulandığını gösteren) anlamına gelir. Uygulamanın diğer bölümlerinde, veritabanının dışında, bu hizmet tanımlayıcısı, söz konusu hizmetten ilgili kullanıcı tanımlayıcısını almak için bir yöntemle eşleştirilir ve kimlik doğrulaması bu şekilde gerçekleştirilir. OpenID için, aynı yöntemi kullanırız, ancak kimlik doğrulama yöntemi daha genelleştirilir (çünkü neredeyse her zaman tam olarak aynı protokolü gerçekleştirebiliriz - farklı bir kimlik URL'si kullanmamız ve bu bizim hizmet tanımlayıcımızdır).

Son olarak, hangi üçüncü taraf kimliklerinin hangi yerel kimlikle eşleştirildiğinin kayıtlarını tutuyorum. Bu kayıtları oluşturmak için akış şöyle görünür:

  • Bir kullanıcı ilk kez bir üçüncü taraf kimliği kullanarak oturum açar. Yerel kimlik kaydı oluşturulur, ardından üçüncü taraf kimlik kaydı oluşturulur ve eşleştirilir.
  • Kontrol panelinde, kullanıcıya üçüncü taraf hizmetlerine giriş yaparak bir hesabı bağlama fırsatı sunulur. (Bunun nasıl çalıştığını gayet açık.)
  • Kullanıcının farkında olmadan birden fazla hesap oluşturduğu senaryoda, çözüm oldukça basittir. Kullanıcı hesaplardan birinde oturum açmışken, daha önce sitede oturum açmak için kullandığı başka bir hesapta oturum açar (yukarıdaki kontrol paneli özelliği ile). Web hizmeti bu çakışmayı algılar (oturum açan kullanıcının yerel kimliği, yeni oturum açmış olan üçüncü taraf kimliğine bağlı yerel kimlikten farklıdır) ve kullanıcıdan bir hesap birleştirmesi istenir.

Hesapların birleştirilmesi, yerel kimliğin her bir alanını (uygulamadan uygulamaya farklılık gösterecek ve yerel kimlik kayıtlarınızda yalnızca birkaç alanınız varsa kolay olmalıdır) birleştirmek ve daha sonra bağlantılı üçüncü taraf kimliklerini sağlamak meselesidir. sonuçta ortaya çıkan yerel kimliğe bağlıdır.


1
Bu çok iyi bir çözüm (Yerel kimlik çarpışmasını otomatik olarak tespit etme fikrini seviyorum)! Uygulamaya ilk girişten sonra bağlanan "ekstra" hesaplara kullanıcı otomatik giriş yapmak için bir yol buldum merak ediyorum. Kullanıcının her ziyaret ettiğinde her bir hesaba ayrı ayrı giriş yapması gerekir mi (bu sağlayıcılarla zaten aktif bir oturum yoksa)?
Alexandra

@Alexandra "Ek hesaplar" ile ne demek istiyorsun? Kullanıcı, her biri için yeni bir yerel kimlik oluşturarak birkaç farklı kimlik doğrulayıcı aracılığıyla uygulamada oturum açtığında ne olacağını soruyor musunuz?
yanak

Sanırım bu uygun bir açıklama ve kendi sorusunu garanti ediyor: stackoverflow.com/questions/11060368/…
Alexandra

3
Yine de soru, ancak kullanıcı siteye aynı e-posta adresini kullanarak kaydolursa ne olur? onlara e-postanın zaten var olduğunu mı soruyorsunuz (üçüncü taraf modelinden gelen e-posta) mı yoksa yine de siteye kaydettik mi ve bu hesapları birleştirdik mi?
user962206

@ user962206 birçok hizmet gizlilik nedenleriyle size 'gerçek' e-posta adresini sağlamaz. Örneğin, Facebook size birisinin kayıt için kullanacağından şüphelendiğim "user.name@facebook.com" adresini vereceğini bildiğim kadarıyla Twitter size herhangi bir e-posta adresi vermeyecektir.
kapex

44

Çakışan birleştirme faktörü olarak e-postaya dayalı bir çok site bulma eğilimindeyim .

Bunun uygulanabilir bir seçenek olduğunu görebiliyorum, ancak yine de nasıl birleştirileceğine tercihinize bağlı. E-posta Adresi, kullanıcıların sitenizdeki bazı önemli bilgi değişikliklerini doğrulamak için parolanızı değiştirmek, hizmetin feshi, hesap bakiyesi düşük vb. . Kültürel olarak: Bir e-postanın OAuth kimlik doğrulama hizmetlerinde oldukça benzersiz bir kimlik olduğunu varsaymanın makul olduğunu düşünüyorum. Verilen, Facebook ve Google için giriş formlarının istediği şey.

Mevcut düşünce sürecim.

Giriş sayfasında 3 seçenek vardır

  • Kendi sitenizin üyeliği
  • Facebook ile giriş
  • Google ile giriş yapın

1) Kullanıcı ilk kez oturum açar: bir hesabın ilk oluşturulduğu ve doldurulduğu bir kayıt akışını tetikler.

 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) Başka bir zamanda kullanıcı geri döner ancak Google Giriş Sayfasını tıklamaya karar verir

      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) Artık veritabanı girişlerinizdeki e-postaya güvendiğiniz hesabı harici girişlerden güvendiğiniz hesapla birleştirdiniz.

Sonraki girişler için

Öncelikle harici girişleriniz varsa ve daha sonra bir kullanıcının daha sonra bir şifre ile giriş yapabilmesini istiyorsanız ne olur?

Bunu yapmanın iki kolay yolunu görüyorum

  • Harici bir yetkilendirmeden hesap oluşturulduğunda yapılan ilk girişlerde, uygulamanıza ilk girişlerini tamamlamak için onlardan bir şifre isteyin

  • Önceden facebook veya google kullanarak kayıt yaptılarsa, bir şekilde kendi sitenizin kayıt formunu kullanarak kaydolmak istediler. Girdikleri e-posta adresinin zaten mevcut olup olmadığını tespit edin, şifre isteyin ve kayıt tamamlandıktan sonra bir e-posta onayı gönderin.


1
Harici bir kimlik doğrulama düzeni (Facebook, Google, Twitter vb.) Kullandığınızda, harici sağlayıcı şifresine asla erişemezsiniz. Yukarıdaki örnekteki şifre KENDİ web uygulamanızın şifresidir.
Max Alexander

6
Twitter, kullanıcılara e-posta sunmuyor. Twitter UserId yoksa ilk kimlik doğrulamasından sonra, bir e-posta ve şifre isteyin. E-posta ve şifre varsa, hesapları bağlayın. Değilse, sonraki kimlik doğrulama işlemleri için e-postayı ve şifreyi saklayın. Bu hiç yardımcı oldu mu?
Max Alexander

1
Bir yan not olarak, Twitter uygulamanızın kullanıcının e-posta adresini alması için izin istemek artık mümkün .
Sunil

2
Facebook, insanların e-postalarını doğrulamasını sağlıyor mu? Örneğin Github'ın bilmediğini biliyorum. Kötü niyetli bir kullanıcı, başka birinin e-posta adıyla Github'a kaydolabilir ve daha sonra bu stratejiyle sitenizdeki hesaplarına erişebilir. (Github API'sı size e-postalarının doğrulanıp doğrulanmadığını söyler - doğrulanmamış bir e-posta adresinde Github ile kimlik doğrulaması yapan herkesi reddedebilirsiniz)
Matthew Moisen

6
Bu, bir kullanıcı sosyal medya üzerinden kaydolursa, e-posta adresini sosyal medyada düzenler, bir başkası aynı e-posta adresini alır, sosyal medyada kayıtlı ve daha sonra oturum açarsa, başka bir hesapla birleştirilirse güvenlik ihlalidir. Bu çok düşük bir ihtimal ama bir ihlal daha az değil. Yoksa bir şey mi kaçırıyorum.
Shane

35

Bunu sled.com ile yaşadım. Burada hesap oluşturma ve giriş için birden fazla üçüncü taraf hesabını destekleme konusunda birçok sorun var. Onlardan bazıları:

  • Hem yerel şifreyi hem de üçüncü taraf girişlerini desteklemeniz mi gerekiyor?

Sled.com için, eklediği küçük değer ve bir şifre giriş formunun güvenliğini sağlamanın ek maliyeti nedeniyle yerel şifreyi bırakmaya karar verdim. Şifreleri kırmak için bilinen birçok saldırı vardır ve şifreleri tanıtacaksanız, bunların kırılmasının kolay olmadığından emin olmalısınız. Ayrıca, sızıntılarını önlemek için bunları tek yönlü bir karma veya benzeri bir yerde saklamanız gerekir.

  • Birden çok üçüncü taraf hesabını desteklemede ne kadar esnekliğe izin vermek istiyorsunuz?

Görünüşe göre üç giriş sağlayıcıyı zaten seçmişsiniz: Facebook, Twitter ve LinkedIn. Bu harika çünkü OAuth kullanıyor ve iyi tanımlanmış bir dizi güvenilir sağlayıcıyla çalışıyorsunuz. Ben OpenID hayranı değilim. Geriye kalan soru, aynı sağlayıcıdan birden fazla üçüncü taraf hesabını desteklemeniz gerekip gerekmediğidir (örneğin, iki Twitter hesabının bağlı olduğu bir yerel hesap). Hayır kabul ediyorum, ancak bunu yaparsanız, bunu veri modelinize yerleştirmeniz gerekir.

Sled için Facebook, Twitter ve Yahoo! ve her kullanıcı hesabı içinde her biri için bir anahtar depolayın: {"_id": "djdjd99dj", "yahoo": "dj39djdj", twitter: "3723828732", "facebook": "12837287"}. Her bir üçüncü taraf hesabının yalnızca tek bir yerel hesaba bağlanabilmesini sağlamak için bir grup kısıtlama koyarız.

Aynı üçüncü taraf sağlayıcıdan birden fazla hesaba izin verecekseniz, benzersizliği sağlamak için listeleri ve bununla birlikte tüm diğer kısıtlamaları desteklemek için listeler veya başka yapılar kullanmanız gerekir.

  • Birden çok hesap nasıl bağlanır?

Kullanıcı hizmetinize ilk kez kaydolduğunda, önce üçüncü taraf sağlayıcıya gider ve doğrulanmış bir üçüncü taraf kimliğiyle geri gelir. Daha sonra onlar için yerel bir hesap oluşturursunuz ve istediğiniz diğer bilgileri toplarsınız. E-posta adreslerini topluyoruz ve ayrıca yerel bir kullanıcı adı seçmelerini istiyoruz (formu diğer sağlayıcıdan mevcut kullanıcı adlarıyla önceden doldurmaya çalışıyoruz). Daha sonra hesap kurtarma için bir tür yerel tanımlayıcıya (e-posta, kullanıcı adı) sahip olmak çok önemlidir.

Tarayıcı, mevcut bir hesap için bir oturum çerezi (geçerli veya süresi dolmuş) yoksa ve kullanılan üçüncü taraf hesabının bulunamadığında, sunucu ilk kez oturum açtığını bilir. Kullanıcıya sadece giriş yapmadıklarını, ancak yeni bir hesap oluşturduklarını bildirmeye çalışırız, böylece zaten bir hesapları varsa, umarım mevcut hesaplarıyla duraklar ve giriş yaparlar.

Ek hesapları bağlamak için tam olarak aynı akışı kullanırız, ancak kullanıcı üçüncü taraftan geri döndüğünde, yeni bir hesabı bir giriş işlemine bağlama girişimi arasında ayrım yapmak için geçerli bir oturum çerezi varlığı kullanılır. Her türden yalnızca bir üçüncü taraf hesabına izin veriyoruz ve zaten bir tane bağlıysa, işlemi engelleyin. Sorun değil, çünkü zaten bir tane (sağlayıcı başına) varsa, yeni bir hesabı bağlamak için arayüz devre dışı bırakılır, ancak her ihtimale karşı.

  • Hesaplar nasıl birleştirilir?

Bir kullanıcı zaten yerel bir hesaba bağlı olan yeni bir üçüncü taraf hesabını bağlamaya çalıştıysa, iki hesabı birleştirmek istediklerini onaylamasını istersiniz (veri kümenizle böyle bir birleştirmeyi yapabileceğinizi varsayarsak - genellikle daha kolay daha iyi). Ayrıca, birleştirme istemek için özel bir düğme de sağlayabilirsiniz, ancak pratikte yaptıkları tek şey başka bir hesabı bağlamaktır.

Bu oldukça basit bir durum makinesidir. Kullanıcı üçüncü taraftan üçüncü taraf hesap kimliğiyle geri döner. Veritabanınız üç durumdan birinde olabilir:

  1. Hesap yerel bir hesaba bağlı ve oturum çerezi mevcut değil -> Giriş
  2. Hesap yerel bir hesaba bağlı ve bir oturum çerezi var -> Birleştir
  3. Hesap yerel bir hesaba bağlı değil ve oturum çerezi mevcut değil -> Kaydol
  4. Hesap yerel bir hesaba bağlı değil ve bir oturum çerezi var -> Ek hesap bağlama

    • Üçüncü taraf sağlayıcılarla hesap kurtarma nasıl yapılır?

Bu hala deneysel bölge. Çoğu hizmet hem üçüncü taraf hesaplarının yanında yerel bir parola sağladığından hem de "parolamı unuttum" kullanım durumuna odaklandığından, yanlış gidebilecek her şeye odaklanmadığından bunun için mükemmel bir UX görmedim.

Sled ile "Oturum açmak için yardıma mı ihtiyacınız var?" ve tıkladığınızda kullanıcıdan e-posta veya kullanıcı adını isteyin. Bakıyoruz ve eşleşen bir hesap bulursak, kullanıcıya otomatik olarak hizmette oturum açabilecek bir bağlantıyı e-postayla gönderin (bir kez iyi). Bir kez girdikten sonra, bunları doğrudan hesap bağlama sayfasına götürüyoruz, onlara bir göz atmaları ve potansiyel olarak ek hesapları bağlamaları gerektiğini söyledik ve onlara zaten bağladıkları üçüncü taraf hesaplarını gösterdik.


Bu çözüm benim için çok daha iyi, teşekkürler!
Roy Shoa

2
Oturum çerezi, kullanıcıyı tanımlayacak kadar iyi değildir. Başka bir kullanıcı aynı cihazı kullanıyorsa ne olur?
DeepBlue

23

Hesapları otomatik olarak birleştirmeye yönelik her iki yaklaşım da, birinin hesabı devralmasına izin verecek oldukça büyük bir güvenlik açığı bırakır. Her ikisi de, kayıt yapan bir kullanıcıya birleştirme seçeneği sunduğunda kullanıcının söylediği kişi olduğunu varsayar.

Güvenlik açığını azaltmak için önerim, kullanıcının kimliğini doğrulamak için birleştirme gerçekleştirmeden önce kullanıcıdan bilinen Kimlik Sağlayıcılarından biriyle kimlik doğrulaması istemektir.

Örnek: A Kullanıcısı Facebook kimliğiyle kaydolur. Bir süre sonra sitenize geri döner ve Windows Live ID ile erişmeye ve kayıt işlemini başlatmaya çalışırlar. Siteniz A Kullanıcısını şu şekilde isteyecektir ... Görünüşe göre daha önce Facebook'a kaydoldunuz. Lütfen Facebook ile giriş yapın (bağlantı sağlayın) ve Windows Live ID'nizi mevcut profilinizle birleştirebiliriz.

Başka bir alternatif, kullanıcının kimlikleri birleştirirken sağlaması gereken ilk kayıtta paylaşılan bir sırrı (şifre / kişisel soru) saklamaktır, ancak bu sizi paylaşılan sırları saklama işine geri götürür. Ayrıca, kullanıcının paylaşılan sırrı ve onunla birlikte gelen iş akışını hatırlamadığı senaryoyu ele almanız gerektiği anlamına gelir.


sağlayıcıdan bir e-posta adresi almazsanız ne yaparsınız?
fred.kassi

1

Gönderilerin çoğu oldukça eski ve sanırım Google'ın ücretsiz Firebase Kimlik Doğrulama hizmeti henüz yoktu. OAuth ile doğruladıktan sonra, OAuth jetonunu ona iletir ve referans için saklayabileceğiniz benzersiz bir kullanıcı kimliği alırsınız. Desteklenen sağlayıcılar Google, Facebook, Twitter, GitHub'dır ve özel ve anonim sağlayıcılar kaydetme seçeneği vardır.


Ateş tabanının mantıklı olmadığı düşünülen kullanım durumları vardır. Örneğin, birden fazla giriş yapan intranet sistemleri ..
Bostwick


-4

Bir hesaptan giriş yapmanıza izin vermelisiniz , ardından giriş yaptığınızda, onunla birleştirmek için farklı bir hesap ekleme seçeneği verin.


4
Kullanıcı bunu yapmazsa ve 4 farklı hesapla bulursa ne olur? Bu durumda birleşmeye izin veren bir mimari nasıl oluşturulur?
David Boike

İhtiyaçlarınıza bağlı olarak bu aslında geçerli bir öneri olabilir. Ben sadece birleştirme veya hesapları bağlayan sonradan sonra yapılabilir düşünenleri uyarmak istiyorum: Eğer bu daha sonra isteyebileceğiniz bir şey olduğuna inanıyorsanız o zaman başlangıçta veritabanı tasarımı ile bunun için kendinizi hazırlamak istersiniz: Bir seçeneği bir UserGroup ve bir UserMapping'e sahip olmaktır. OAuth kullanıcı kimliğini veya E-posta ve Parola kullanıcı kimliğini bir UserGroup ile eşleyebilirsiniz.
BumbleB2na
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.