Kimlik doğrulama için Facebook kullanan web sitesi için REST API


86

Sitede oturum açmanın ve kimliğinizi doğrulamanın tek yolunun Facebook olduğu bir web sitemiz var (bu benim seçimim değildi). Facebook ile ilk kez oturum açtığınızda, sizin için otomatik olarak bir hesap oluşturulur.

Şimdi sitemiz için bir iPhone uygulaması ve ayrıca başkalarının hizmetimizi kullanması için genel bir API oluşturmak istiyoruz.

Bu soru, web sitemizle uygulamadan / API'den nasıl kimlik doğrulaması yapılacağıyla ilgilidir ve 2 bölüme ayrılmıştır:

  1. Bir API'den kimlik doğrulama yöntemi olarak yalnızca Facebook OAuth kullanan bir web sitesine REST kimlik doğrulamasını işlemenin doğru yolu nedir?

REST API için standart kimlik doğrulama yöntemleri hakkında çok şey okudum ve araştırdım. Bu tür bir kullanıcı için kimlik bilgileri olmadığından HTTPS üzerinden Temel Kimlik Doğrulama gibi yöntemleri kullanamayız . Böyle bir şey bu sadece API kullanarak uygulamaları doğrulamak için gibi görünüyor.

Şu anda, düşünebileceğim en iyi yol, API'mizde bir uç noktaya ulaşmanız / yetkilendirmeniz, Facebook OAuth'a yönlendirmeniz, ardından siteye geri dönmeniz ve API kullanıcısının daha sonra kimlik doğrulaması için kullanabileceği bir 'belirteç' sağlamasıdır. istekleri.

  1. Oluşturduğumuz resmi bir uygulama için, genel API'yi aynı şekilde kullanmamız gerekmez. O halde web sitemizle konuşmanın ve kullanıcıların kimliğini doğrulamanın en iyi yolu nedir?

API (genel) anahtarları ve gizli (özel) anahtarları kullanarak API'mizi kullanan 3. taraf uygulamaların kimliğini nasıl doğrulayacağımı anlıyorum (düşünüyorum). Bununla birlikte, uygulamayı kullanan kullanıcının kimliğini doğrulamaya gelince, bir kullanıcının kimliğini doğrulamak için tek yolumuz Facebook iken, bunun nasıl yapılacağı konusunda kafam biraz karışıyor.

Çok bariz bir şeyi kaçırdığımı veya genel REST API'lerinin nasıl çalışması gerektiğini tam olarak anlamadığımı hissediyorum, bu nedenle herhangi bir tavsiye ve yardım çok takdir edilecektir.


Stackoverflow.com/questions/30230482/… adresinde bunlardan bazılarından
bahseden

Yanıtlar:


99

GÜNCELLEME: aşağıya bakın

Ben de bu soru hakkında çok düşünüyordum. Henüz benim için tam olarak net değil ama gitmeyi düşündüğüm rota bu. Bir REST API oluşturuyorum ve kullanıcılarım sadece Facebook bağlantısı ile yetkilendiriyor.

MÜŞTERİ üzerinde:

  1. Giriş yapmak ve bir OAUTH2 kodu almak için Facebook API'sini kullanın.
  2. Bu kodu bir erişim belirteci ile değiştirin.
  3. Özel API'ime yapılan her çağrıda Facebook kullanıcı kimliğini ve erişim belirtecini ekleyeceğim.

API'de (kullanıcı kimlik doğrulaması gerektiren her yöntem için):

  1. Yukarıdan erişim belirtecini kullanarak / me Facebook grafiğine bir istekte bulunun.
  2. Döndürülen Facebook kullanıcı kimliğinin, API'ma yukarıdan iletilen kullanıcı kimliğiyle eşleştiğini doğrulayın.
  3. Erişim belirtecinin süresi dolduysa, ek iletişim gerekir.

Bunu henüz test etmedim. Nasıl geliyor?

--- Güncelleme: 27 Temmuz 2014 soruyu cevaplamak için ---

Yukarıdaki değişimi yalnızca giriş yaptığımda bir kez kullanıyorum. Hangi kullanıcının oturum açtığını belirledikten sonra, kendi erişim jetonumu oluşturuyorum ve bu jeton o noktadan itibaren kullanılacak. Yani yeni akış şuna benziyor ...

MÜŞTERİ üzerinde:

  1. Giriş yapmak ve bir OAUTH2 kodu almak için Facebook API'sini kullanın.
  2. Bu kodu bir erişim belirteci ile değiştirin.
  3. Token bir erişim talep benim jeton bir parametre olarak Facebook gibi API,

API hakkında

  1. Erişim belirteci isteği alın.
  2. Facebook erişim jetonunu kullanarak / me Facebook grafiğine bir istekte bulunun
  3. Facebook kullanıcısının var olduğunu ve veritabanımdaki bir kullanıcıyla eşleştiğini doğrulayın
  4. Kendi erişim jetonumu oluşturun, kaydedin ve bu noktadan sonra kullanılmak üzere istemciye iade edin

Hey, bu biraz geç bir cevap, ancak çözümünüz ilk cevabımdaki sorunu çözüyor gibi görünüyor. Elbette tel üzerindeki (id, token) çiftini açık metin olarak göndermemek için HTTPS kullanmanız gerekir. Ama işe yaraması gerekiyor gibi görünüyor!
Olivier Lance

Sanırım / beni sunucuda aramak ve mobil istemci tarafından kullanılacak kendi erişim jetonunuzu oluşturmak iyi olur.
Der_Meister

FB sırrını mobil uygulamada saklamanın kötü bir uygulama olduğunu buldum. Facebook, bunu yalnızca sunucunuzda saklamanızı önerir. developer.facebook.com/docs/opengraph/using-actions/…
Der_Meister

API sunucusuna her seferinde user_id ve access_token gönderirsek (post / get params olarak). Biri bağlantıya müdahale edebilirse güvenlik açığı yaratır mı?
Nathan Do

@NathanDo İstemciniz ve API sunucusu arasında HTTPS kullanın ve birisi bağlantıyı keserse bu sorun olmamalıdır (Heartbleed tipi güvenlik açıkları bir yana).
dcr

15

Bu, temelde Chris'in güncellenmiş cevabına benzeyen JWT'leri (JSON Web Jetonları) kullanan uygulamamdır. Facebook JS SDK ve JWT kullandım.

İşte benim uygulamam.

  1. İstemci: Oturum açmak ve erişim jetonunu almak için Facebook JS SDK'yı kullanın.

  2. İstemci:/verify-access-token Uç noktayı çağırarak API'mden JWT iste .

  3. MyAPI: Erişim belirteci alır, /meFacebook API'nin uç noktasını çağırarak bunu doğrulayın .

  4. MyAPI: Erişim belirteci geçerliyse, kullanıcıyı veritabanından bulur, varsa kullanıcının oturumunu açar . Yük olarak gerekli alanlara sahip bir JWT oluşturun, bir son kullanma tarihi ayarlayın, gizli anahtarla imzalayın ve istemciye geri gönderin.

  5. İstemci: JWT'yi yerel depoda saklar.

  6. İstemci: Belirteci (5. adımdaki JWT) bir sonraki API çağrısı talebiyle birlikte gönderir.

  7. MyAPI: belirteci gizli anahtarla doğrulayın, belirteç geçerliyse belirteci yenisiyle değiştirin, API yanıtıyla birlikte istemciye geri gönderin. (Daha sonra jetonun doğrulanması için harici API çağrısı yapılmaz) [jeton geçersizse / süresi dolmuşsa istemciden tekrar kimlik doğrulaması yapmasını ve 1'den itibaren tekrar etmesini isteyin]

  8. İstemci Saklanan jetonu yenisiyle değiştirir ve bir sonraki API çağrısı için kullanır. Jetonun süresi dolduğunda, jetonun süresi sona erer ve API'ye erişimi iptal eder.

Her jeton bir kez kullanılır.

Güvenlik ve JWT hakkında daha fazla yanıt okuyun

JWT ne kadar güvenli

JWT'nin kodunu çözebilirseniz, bunlar nasıl güvenlidir?

Kullanıcı kimliği ve kimlik doğrulama jetonları olarak JSON Web Jetonları (JWT)


3
Sanırım # 3 olması gerektiğini düşünüyorum /debug_token, böylece belirtecin gerçekten uygulamanız için olup olmadığını kontrol edebilirsiniz.
Peppe LG

2
access_tokenİstemcide talep etmeyin . "Kod iş akışını" kullanın. Geçiş codeMyAPI borsada için Facebook'a başka gidiş-dönüş yapmak codeile access_token. Bu, burada daha ayrıntılı bir şekilde açıklanmıştır: developer.facebook.com/docs/facebook-login/security
omikron

5

Aynı soruyu cevaplamaya çalışıyorum ve son zamanlarda çok okuyorum ...

Cevabım olmayacak ama işler benim için biraz daha netleşiyor. Bahsettiğiniz makaledeki yorumları okudunuz mu? Onları gerçekten ilginç ve yararlı buldum.

Sonuç olarak ve ilk makalenin yazılmasından bu yana olayların nasıl geliştiğinin ışığında, işte yapacağımı düşündüğüm şey:

  • Her yerde HTTPS - bu, HMAC, imzalama, nonce, ...

  • OAuth2'yi kullanın:

    • Kimlik doğrulama istekleri kendi uygulamalarımdan / web sitemden geldiğinde, daha önce bahsedilen makaleye verilen yanıtta açıklanan bu 'numarayı' (veya bir varyasyonunu) kullanın .

    • Benim durumumda, iki tür kullanıcım var: klasik giriş / şifre kimlik bilgilerine sahip olanlar ve Facebook Connect ile kaydolanlar.
      Bu yüzden, "Facebook ile Giriş Yap" düğmesi içeren normal bir giriş formu sağlardım. Kullanıcı kendi "klasik" kimlik bilgileriyle giriş yaparsa, bunları bir grant_type=password. İle OAuth2 uç noktama gönderirim .
      Facebook üzerinden giriş yapmayı seçerse, bunun iki aşamalı bir süreç olacağını düşünüyorum:

      • İlk olarak, bir FBSession açmak için Facebook iOS SDK kullanın
      • Bu yapıldığında ve uygulamaya kontrol geri verildiğinde, o kullanıcı için bir Facebook kimliği almanın bir yolu olmalıdır. Bu kimliği, sunucum tarafından "FB Kullanıcı Kimliği kullanarak" olarak anlaşılan bir uzantı izni ile tek başına OAuth2 uç noktama gönderirdim .

Lütfen tüm bunlar üzerinde yoğun bir şekilde araştırma yaptığımı unutmayın, bu yüzden bu mükemmel bir cevap olmayabilir ... belki de doğru bir cevap bile olmayabilir! Ancak bunun iyi bir başlangıç ​​noktası olacağını düşünüyorum. Facebook kimlik doğrulaması için bir "uzatma izni" kullanma fikri, işleri düzgün bir şekilde yapmak için kayıt yaptırmayı gerektirebilir mi? Ben tam olarak emin değilim.

Her neyse, umarım size biraz yardımcı olabilirim ve en azından bu soruna en iyi çözümü bulmak için bir tartışma başlatabilir :)

Güncelleme
Facebook girişi yorumlarda belirtildiği gibi bir çözüm değildir: herhangi biri keyfi bir kullanıcı kimliği gönderebilir ve API'da bu kullanıcı olarak oturum açabilir.

Böyle yapmaya ne dersin?

  • "Facebook oturum açma" düğmesiyle bir oturum açma formu gösterin
  • Bu oturum açma yöntemi seçilirse, Facebook SDK gibi davranın: kimlik doğrulama sunucunuzdan bir web sayfası açın, bu Facebook oturumunu başlatacaktır.
  • Kullanıcı oturum açtıktan sonra, Facebook onaylamak için yeniden yönlendirme URL'nizi kullanacaktır; bu URL'nin kimlik doğrulama sunucunuzun başka bir uç noktasına işaret etmesini sağlayın (muhtemelen aramanın bir uygulamadan geldiğini gösteren fazladan bir parametre ile?)
  • Kimlik doğrulama uç noktasına ulaşıldığında, kimlik doğrulama, kullanıcıyı güvenli bir şekilde tanımlayabilir, FB Kullanıcı Kimliği / FB Oturumunu koruyabilir ve tıpkı Facebook SDK'nın yapacağı gibi özel bir URL şeması kullanarak uygulamanıza bir erişim belirteci döndürebilir.

Daha iyi görünüyor?


1
Cevabın için teşekkürler! Söylediklerinizin çoğunu düşünmüştüm, ancak FB iOS SDK'yı kullanmak ve ardından Facebook Kullanıcı Kimliğini göndermekle ilgili asıl endişem, API uç noktanıza istediğiniz herhangi bir kimliği göndermenin ve olduğunu iddia etmenin kolay olmayacağıydı. Başka kullanıcı? Bu genellikle sıkışıp kaldığım yer ..
Adam

Aslında! Bunu düşünmem aptalca bir şeydi ... Yani çözüm bir şekilde kendi kimlik doğrulama sunucunuzdan geçmeli ...
Olivier Lance

Cevabımı başka bir çözüm fikriyle güncelledim ... ama asıl sorunuzda bundan bahsettiğinizi fark ettim! Şu anda başka bir şey göremiyorum ...
Olivier Lance
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.