2012-05-24 17 views
8

Mam aplikację na płótnie na Facebooku. Używam zestawu SDK JS do uwierzytelniania użytkownika po stronie przeglądarki i żądania różnych informacji za pośrednictwem FB.api (np. Nazwisko, przyjaciele itp.).Jak bezpiecznie przekazać identyfikator Facebooka z klienta na serwer?

Chcę również utrzymują kilka dodatkowych informacji o użytkowniku (nie odbędzie się na Facebook) do bazy danych na moim serwerze poprzez ajax połączenia:

{ userFavouriteColour: "Red" } 

aby zapisać to na serwerze i stowarzyszonej z prawidłowym użytkownikiem , Muszę znać Facebookowy uid i to stanowi problem. Jak przekazać numer identyfikacyjny od klienta do serwera.

Opcja 1: Dodaj UID do żądania ajax:

{ uid: "1234567890", 
    userFavouriteColour: "Red" } 

To oczywiście nie jest dobre. Byłoby trywialne, gdyby ktoś złożył prośbę o dodanie do mojego serwisu internetowego za pomocą czyjegoś identyfikatora na Facebooku i zmienił swój ulubiony kolor.

Opcja 2: Na serwerze wyodrębnij identyfikator z pliku cookie: Czy to możliwe? Czytałem, że Facebook ustawia plik cookie zawierający identyfikator UID i dostęp, ale czy mam dostęp do tego pliku cookie w mojej domenie? Co ważniejsze, mogę bezpiecznie wyodrębnić postaci UID cookie lub jest to otwarty na fałszowanie podobnie jak wariant 1.

Wariant 3: po stronie serwera uwierzytelniania użytkownika na serwerze: mogę korzystać z server- uwierzytelnianie po stronie serwera w celu sprawdzenia tożsamości użytkownika na moim serwerze. Ale czy to zadziała, jeśli korzystam już z uwierzytelniania po stronie klienta w przeglądarce? Czy otrzymam dwa różne tokeny dostępu? Chciałbym wysłać żądania FB.api z przeglądarki, więc potrzebuję tokena dostępu na kliencie (nie tylko na serwerze).

To musi być bardzo powszechny scenariusz, więc myślę, że brakuje mi czegoś fundamentalnego. Czytałem wiele dokumentacji na Facebooku (różne przepływy uwierzytelniania, tokeny dostępu, podpisane_request, itp.) I wiele postów na SO, ale nadal nie rozumiem, jak po stronie klienta uwierzytelnianie i uwierzytelnianie po stronie serwera ładnie się razem.

Krótko mówiąc, chcę poznać tożsamość użytkownika na serwerze, ale nadal wysyłam żądania do api Facebooka z przeglądarki klienta?

(używam ASP.NET oraz C# SDK Facebook na serwerze)

EDIT: Dodano Bounty. Miałem nadzieję uzyskać bardziej deifnitive, oficjalne zalecenie, jak poradzić sobie z tą sytuacją, a nawet przykład. Jak już wspomniano, przeczytałem już wiele oficjalnych dokumentów FB na temat przepływów uwierzytelniających, ale nadal nie mogę znaleźć niczego ostatecznego na temat tego, jak działa uwierzytelnianie po stronie klienta i po stronie serwera.

Odpowiedz

3

Wariant 1: Najprostszym sposobem mogę myśleć jest włączenie accessToken w JS i przekazać go za pomocą wywołania AJAX.

Opcja 2: Stosując takie same jak w wariancie 1, ale zamiast wysyłać tylko accessToken wysłać signedRequest.

Po stronie serwera można dekodować go stosując (TryParseSignedRequest metody), które dadzą Ci UserID :-)

UWAGA: signedRequest jest szyfrowana z tajnymi aplikacji. jesteś jedyną osobą, która powinna to wiedzieć, więc jesteś bezpieczny w tym celu.

Zastrzeżenie:

mam żadnego doświadczenia kodowania w C#, ale trochę szukaj w google dał mi tak:

Facebook C# SDK for ASP.NET

Making AJAX Requests with the Facebook C# SDK

+0

Jeśli przekażę to hasło przez ajax, czy istnieje sposób na wyodrębnienie identyfikatora użytkownika Facebook z tokenu na moim serwerze bez zwracania się do Facebooka? Czy to jest bezpieczne przed podszywaniem się? Nie chcę wysyłać żądania FB api z mojego serwera, więc chcę wyodrębnić identyfikator użytkownika na podstawie informacji przekazanych przez klienta. – njr101

+0

well, FB.getLoginStatus (https://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus/) w Javacriptu zwraca więcej tokena dostępu, ale także identyfikator użytkownika, dzięki czemu możesz wysłać go na serwer side ... – Roni

+0

Dzięki za link - to wyjaśnia, jak zdobyć userId na kliencie. Może nie wyjaśniam się bardzo wyraźnie. Jeśli przekażę ten ID użytkownika na mój serwer, będzie on otwarty na fałszowanie. Jak uzyskać identyfikator użytkownika na serwerze w bezpieczny sposób? – njr101

0

Nie wiem, czy jest to język specyficzny, ale korzystanie z uwierzytelniania po stronie serwera i po stronie klienta nie szkodzi.

Możesz pracować nad opcją 2, ale tak, to będzie również podatne na podszywanie się.

Wykonując opcję 3, otrzymasz pojedynczy token dostępu dla tej sesji użytkownika, więc byłby to najlepszy wybór, ponieważ zawsze masz szansę na podszywanie się przy przekazywaniu informacji o użytkowniku ze strony klienta.

+0

Czy to oznacza, że ​​mam dwa różne tokeny dostępu, jeden dla żądań od klienta i jeden dla żądań z serwera? A może oba żetony dostępu byłyby takie same? – njr101

+0

będziesz mieć ten sam token dostępu. –

0

Niedawno miałem dokładnie to samo pytanie. To opcja 2. Sprawdź this post na Facebooku.

Szczerze mówiąc nie jestem wystarczająco hackerem, aby wiedzieć, czy można sfałszować UID w ciasteczku, ale wydaje się, że jest to "oficjalny" sposób na zrobienie tego.

EDYCJA: do drugiego pytania w ramach opcji 2, tak, wierzę, że musisz uzyskać dostęp do tego pliku cookie w swojej domenie.

+0

Dzięki za podpowiedź, ale jak bardzo wyodrębniam userId? Przypuszczam, że muszę wyodrębnić go z elementu accessToken, ponieważ jest on zaszyfrowany. Przykład w linku korzysta z pakietu PHP SDK. Ponieważ jest to możliwe w PHP, myślę, że informacje są przechowywane w AccessToken, ale nie mogę znaleźć nigdzie, co wyjaśnia, jak wyodrębnić go za pomocą C# SDK (lub ręcznie nawet) – njr101

+0

Nie jestem zaznajomiony z C# SDK, ale możesz rzucić okiem na to, jak działa sdk PHP, patrząc na źródło [tutaj] (https://github.com/facebook/php-sdk/blob/master/src/base_facebook.php) znajdując 'getUserFromAvailableData' na Strona. Musisz dostać ['signed_request'] (http://developers.facebook.com/docs/authentication/signed_request/) i rozszyfrować go, używając mojego sekretu aplikacji. Przykro mi, nie mogę mówić z dużą jasnością, ponieważ w dużej mierze trzymałem się zestawu SDK PHP, który jest dobrze udokumentowany. –

+1

Dzięki za cynk. Przeglądając kod źródłowy, w PHP robią to dokładnie tak, jak sugeruje @Roni. Wygląda na to, że muszę pobrać identyfikator użytkownika z podpisanego żądania, a nie z tokenu dostępu. Dzięki za pomoc. – njr101

1

To bardzo proste faktycznie.

Gdy użytkownik ładuje aplikację, użyj server side authentication, zdobądź token dostępu i załaduj dane użytkownika, wysyłając żądanie api z serwera.
Po stronie serwera będziesz miał wszystko, czego potrzebujesz i jest piaskowany.

Gdy strona wyświetla się dla użytkownika, za pomocą js sdk uzyskać dane uwierzytelniające użytkownika, powinieneś być w stanie użyć FB.getLoginStatus, ponieważ użytkownik już przeszedł uwierzytelnianie po stronie serwera.
Teraz po stronie klienta masz także token dostępu, którego możesz użyć do pobrania danych użytkownika z api wykresu.

Dwa tokeny będą różne, a także będą miały inne wygasanie, ale nie powinno to stanowić problemu, zarówno token powinien działać poprawnie, jak się tego oczekuje.
Ponieważ obie strony mają swój własny token i sposób wysyłania żądań do interfejsu API, nie ma potrzeby wysyłania między nimi żadnych danych fb.

Tak więc trzecia opcja, którą mi wymieniłeś, brzmi najlepiej, a także jest bardzo prosta w implementacji.


Edit

Wszystkie facebook SDK są tylko opakowania na żądanie http ponieważ cały FB API jest wykonany na żądania HTTP.
Pakiety SDK zapewniają łatwy i krótszy dostęp do danych bez potrzeby samodzielnego tworzenia adresów URL (z wszystkimi możliwymi parametrami), żądania i analizy odpowiedzi.

Szczerze mówiąc, myślę, że przestanie zapewniać sposób na C# SDK do obsługi uwierzytelniania po stronie serwera jest bardzo złą decyzją.
Jaki jest sens dostarczania zestawu SDK, który nie implementuje całego interfejsu API?

Najlepszą odpowiedzią na twoje pytanie, z mojego doświadczenia, jest użycie uwierzytelniania po stronie serwera i po stronie klienta, a ponieważ C# SDK go nie obsługuje, moją radą jest utworzenie własnego zestawu SDK.
Nie jest to wcale skomplikowane, już zaimplementowałem go dla Pythona i Java (dwa razy), a ponieważ będziesz go rozwijać dla własnych potrzeb, może on być dostosowany do Twoich konkretnych potrzeb, w przeciwieństwie do publicznego SDK, który powinien obsługiwać wszystkie możliwe opcje.


2-ty Edit

Nie ma potrzeby, aby stworzyć całkowicie nowy zestaw SDK, można po prostu „rozciągać” te, których używasz i dodać brakujące części, które są potrzebne, podobnie jak wsparcie uwierzytelniania strona Sever.

+0

Dzięki za odpowiedź. Dokumenty dla stanu C# sdk (http://blog.prabir.me/post/Facebook-CSharp-SDK-Glimpse-into-the-Future.aspx) "... Począwszy od wersji 6, będziesz musiał użyć Facebook Javascript SDK, aby uzyskać token dostępu i przekazać go serwerowi przy użyciu bezpiecznego połączenia https ... ". Wydaje się, że doradzają one przy pobieraniu tokena dostępu na serwerze. Twoje myśli? – njr101

+0

Zmieniono moją odpowiedź. –

+0

Widzę twój punkt widzenia, ale naprawdę chcę uniknąć owijania i utrzymywania własnego SDK - to jest najważniejszy punkt posiadania SDK w pierwszej kolejności. Facebook nieustannie zmienia swoje API i chcę być wolny, aby skupić się na mojej domenie aplikacji, a nie korygować zmian z Facebooka co kilka tygodni. – njr101

Powiązane problemy