Güvenli bir web hizmetine de erişen bir iOS uygulamasında Facebook kimlik doğrulaması için tasarım


402

Hedef: Bir kullanıcının çalıştırdığım korumalı bir web hizmetine erişim gerektiren bir iOS uygulamasında Facebook ile kimlik doğrulaması yapmasına izin verin.

Varsayımlar: Oturum açmak için Facebook'u kullanmamayı tercih eden kullanıcılar için yerel bir kimlik doğrulama (ve kayıt) sistemi mevcuttur.

Detaylar:

  • Bir kullanıcının sistemimiz için ayrı bir hesap / kimlik bilgisi oluşturmadan Facebook ile oturum açma seçeneğini sunmak istediğimizi varsayalım.
  • Kendi yerel kimlik doğrulama mekanizmamızı (kullanıcı adı ve şifre) desteklediğimiz için kendi kullanıcı kimliklerimiz var ve ilk kimlik doğrulamasından sonraki etkileşimler için kullanılan bir kimlik doğrulama kodu yayınlıyoruz.

Facebook'un geliştirici belgelerinde bunun için en iyi uygulamalara sahip olmaması beni şaşırttı. Mevcut tüm belgeler, bir web sitesine FB yetkisi oluşturduğunuzu veya kimlik doğrulaması gerektirmeyen hiçbir hizmeti olmayan bağımsız bir mobil uygulamayı varsayar.

İşte bunun nasıl tasarlanacağına dair ilk düşüncelerim, ancak doğru olup olmadığı konusunda doğrulama istiyorum.

  1. İstemci Facebook iOS Girişini açar
  2. Kullanıcı Arayüzü Kullanıcısı Facebook kimlik bilgileriyle oturum açar ve erişim belirteci alır
  3. iOS Uygulaması erişim kodunu sunucumuza aktarıyor
  4. Sunucumuz (a) belirtecini doğrulamak ve (b) söz konusu erişim belirtecinin FB kullanıcı kimliğini almak için erişim belirtecini kullanarak FB grafik API'siyle konuşur.

    Örneğin sunucumuz, JSON nesnesindeki profil bilgilerini döndürecek olan https://graph.facebook.com/me/?access_token=XYZ adresini arar

  5. Geçerli olduğu varsayılarak, sunucumuz Kullanıcı Kimliğini JSON nesnesinden çıkarır ve kullanıcının zaten bir hesabı olup olmadığını kontrol eder. Eğer öyleyse, o oturum için kullanmak üzere müşteriye kendi yetki biletimizi düzenleriz. Kullanıcının bir hesabı yoksa, Facebook Kullanıcı Kimliği ile yeni bir hesap oluştururuz, kendi benzersiz Kullanıcı Kimliğimizi atarız ve kimlik doğrulama biletimizi düzenleriz.

  6. Müşteri daha sonra kimlik doğrulama gerektiren sonraki etkileşimlere kimlik doğrulama biletini geri gönderir.

Bu bana doğru bir yaklaşım gibi gözüküyor ama delice temel bir şeyi kaçırıp yanlış (karmaşık) yoldan gidip gitmediğimden emin değilim.


1
Bu nasıl çözüldü? Ben de erişim belirtecini geçen ve sunucuda kullanıcıyı döndürme bakıyorum. Akademik görünüyor, ama soruyorum.
Chris Van Buskirk

Bu benim raylar ve cihaz kullanarak benim uygulama oldu: stackoverflow.com/questions/7232490/…
Matt

FB API'sına iki arama yapmak yerine neden auth_hash'ın tamamını geçmiyorsunuz (biri iOS cihazından ve bir kez sunucudan)?
bsiddiqui

1
Farklı bir cihazdan giriş yapmak istiyorsanız (yani kimlik doğrulama biletiniz yok)? Ve sadece yeni bir kimlik doğrulama bileti alırsanız, birinin facebook id / jetonunu yolda kaçırmasını ve kendi cihazında kullanmasını engelleyen nedir?
Amitloaf

Merak ettikten sonra, 5. adımda neden kendi kimlik biletinizi düzenlersiniz? Facebook erişim belirtecini sonraki her sunucu çağrısı için kullanamaz mısınız? Ben sadece bir uygulama yerine her uygulama -> sunucu çağrısı için sunucudan Facebook API bir çağrı gerektireceğini biliyoruz.
Anders

Yanıtlar:


80

Bu konuyu kendim hallettim ve işte beni ısıran kısım:

5. adımınızda ... Bir kullanıcının sizinle Facebook Kimliğinden tamamen ayrı bir hesaba kaydolması mümkündür, değil mi? Sonra başka bir zaman Facebook ile giriş yapıyorlar ... Ve sen sadece ikinci bir hesap oluşturdun ve ilk hesaplarını kaybettin.

Web hizmetinizde oturum açmanın, ardından facebook'ta oturum açmanın ve facebook kimliği ile yerel hesap arasındaki ilişkiyi yakalamanın bir yolu olması gerekir.

Bunun dışında planınız sağlam görünüyor.

Güncelleme : Facebook böyle bir senaryoyu özetleyen bir belge ekledi BURAYA


7
Evet, bunu düşünmüştüm ve sen yerinde değilsin. Aynı e-posta adresiyse hesapları birleştirmeyi planlıyoruz ve eğer değilse, bunları birleştirmek için başka bir yol oluşturacağız.
TMC

İstek yapmak için Sunucu tarafında hangi Sunucu Kitaplığını kullanıyorsunuz?
TimLeung

7
@TimLeung - Benim anlayışım, bir erişim belirtecinin uygulama kimliğini gömdüğü ve içine yerleştirilmiş bir uygulama kimliği OLMADAN bir erişim belirtecine sahip olamayacağınızdır.
Dan Ray

1
@TimLeunge: Kullanıcının erişim belirtecine sahip istekler için Grafik API'sini kullanıyoruz.
TMC

29

Facebook tarafından belirtildiği gibi kimlik doğrulama jetonunu sunucunuza iletmek için https kullanın

Erişim Jetonlarının Paylaşılması

Veri Politikalarımız, uygulamanız için bir Erişim Simgesinin başka herhangi bir uygulamayla paylaşılmasını açıkça yasaklar. Bununla birlikte, aktarım HTTPS kullanılarak gerçekleştiği sürece geliştiricilerin Jetonları yerel bir uygulama ile aynı Uygulamanın sunucu uygulaması (yani aynı Uygulama Kimliğini kullanarak) arasında paylaşmasına izin veriyoruz.


16

Bu stratejide görebildiğim bir sorun, birisinin size farklı bir facebook uygulaması için bir erişim jetonu verebilmesidir. Bildiğim kadarıyla, erişim belirtecinin uygulamanız için olduğunu doğrulamanın bir yolu yoktur, bu yüzden devam edip kullanabilirsiniz.

Yine de çok zararlı görünmüyor. Genellikle kullanıcılar / uygulamalar erişim belirteçlerini paylaşmak yerine korumaya çalışır.

Bunun olası bir istisnası, birinin kendi sitesini veya mobil uygulamasını oluşturması, kullanıcıları için erişim belirteçleri alması ve API'nizi kullanarak kimlik doğrulaması yapmasıdır. Bu başarılı olursa (kullanıcının sitenizde bir facebook hesabı varsa), kötü amaçlı site kullanıcının kimliğine bürünen API'nizi kullanabilir.

Biraz uzun bir atış, ama bence işe yarayabilir.

Düzenleme: Görünüşe göre erişim belirtecini doğrulamanın bir yolu var gibi. @Daaniel tarafından verilen soruya bakın. Kullanıcı erişim belirtecinden uygulama kimliği alın (veya bir belirteç için kaynak uygulamayı doğrulayın) .


Gönderme appsecret_proofbunu önlemelidir ( buraya bakın )
Tony

@Tony appsecret_proofburada nasıl yardımcı olduğunu açıklayabilir misiniz ? Anladığım kadarıyla, Facebook'un sunucunun gizli anahtarı bildiğini kanıtlamaya hizmet ediyor. Ancak ivant, belirteçleri alan ve daha sonra bunları API'nıza gönderen kötü amaçlı bir uygulamadan bahsediyordu. Sunucu uygulama kimliğini doğrulayabilir, ancak uygulama kimliği kötü amaçlı bir uygulama tarafından kolayca aldatılabilir. Peki ... kişi bunu nasıl hafifletir?
YSK

3
https://graph.facebook.com/app/?access_token=[user_access_token]Simgenin, uygulama kimliğini döndüren uygulamanız için oluşturulduğunu doğrulayabilir ve ardından uygulama kimlikleri karşılaştırılır
Nader Alexan

4

çözümünüz tamamen işe yarıyor.

Belki bir alternatif: neden sadece ilk sosyal hizmet talebinden istemciye e-posta almak ve web hizmetinize göndermek değil? Web hizmeti sadece e-postayı ve belki bir social_provider'ı depolayabilir. Web hizmetinizin e-postanın nereden geldiğini doğrulayamayacağını anlıyorum, ancak web hizmetiniz ve müşteriniz arasında yüksek güven ilişkisi yok mu? Varsa, doğru yerden gelen e-postaya güvenebileceğiniz gibi görünüyor. Birisi lütfen bana e-posta tabanlı yaklaşımı aptalca yapan ne kadar açık olduğumu bildirin ...


3
İstemcinin sunucuyla nasıl konuştuğunu kolayca bulabilirim. Sonra isabet edene kadar e-posta gönderebilirim. Her zaman bir doğrulama şekli olmalı
Chris

5
Yüksek güven ve müşteri? Asla aynı cümlede, lütfen. Elbette önceki cümle hariç.
EralpB
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.