2013-01-22 14 views
19

Chciałbym zbudować małą aplikację mobilną (Android i iOS) i mały serwer zaplecza z REST Api.Zapewnij bezpieczne uwierzytelnianie Facebooka na moim serwerze

Użytkownicy mojej aplikacji (Android lub iOS) muszą zalogować się na Facebooku. Robię to, używając facebook mobile sdk. Gdy logowanie zakończy się powodzeniem, Facebook sdk zwróci uwierzytelnienieToken, który jest teraz na smartfonie użytkowników.

Pomysł wygląda następująco: Ilekroć moja aplikacja potrzebuje pewnych danych, aplikacja będzie łączyła się z moim serwerem zapleczem (REST) ​​przez HTTPS. Na przykład: aplikacja wykonuje prosty proces HTTP GET i przekazuje pobrany klucz uwierzytelniający Facebook. Mój serwer otrzymuje to uwierzytelnienie facebookToken i używa tego tokena do określenia, czy użytkownik jest uwierzytelniony i pobiera informacje z profilu facebook (imię, nazwisko itp.). Dlatego serwer kontaktuje się również z Facebookiem i generuje spersonalizowaną odpowiedź na żądanie HTTP GET.

Moje pytania są następujące:

  1. Czy naprawdę wystarczy, aby zdać ten facebookAuthentication tokena dla każdego REST API wezwanie, aby serwer odzyskać prawidłową powiązanych Facebook User?
  2. Używam HTTPS, więc domyślam się, że połączenie jest wystarczająco zaszyfrowane, prawda?
  3. Chyba potrzebuję jakiegoś mechanizmu podpisu, więc podpisz każde wywołanie REST API (przez HTTPS), aby upewnić się, że token facebookAuthentication został wysłany tylko z mojej aplikacji mobilnej. Zrobiłbym to, używając RSA z SHA-1 do podpisania każdego wywołania REST API. Ale problem z tym podejściem polega na tym, że klient musi przechowywać klucz prywatny gdzieś w aplikacji (do podpisywania żądań), a serwer zna klucz publiczny (w celu dopasowania podpisu). Czy to jest poprawne? Jeśli tak, to uważam, że jest to duży problem z bezpieczeństwem, ponieważ aplikacja mobilna (zwłaszcza Android) może zostać zdekompilowana, aby uzyskać klucz prywatny. Jak bezpiecznie przechowywać ten klucz prywatny w mojej aplikacji? Czy istnieje inny system do podpisania, który możesz polecić?

Bt: Czy znasz dobrą bibliotekę RSA na iOS i Androida?

Odpowiedz

8

1) Tak. Wystarczy. Jeśli Twój klient (aplikacja mobilna) ma token, świadczy o tym, że użytkownik jest uwierzytelniony na Facebooku. Więc uwierzytelniłeś użytkownika w ten sposób. Jednak nie wystarczy uwierzytelnić aplikację mobilną (o tym, porozmawiam w punkcie 3).

2) Tak. Jest szyfrowany w obie strony.

3) To trudne. Nazywa się to zdalnym zaświadczeniem. Istnieje DUŻO problemów z tym.

Zanim pójdziesz w tym kierunku, trzeba zadać sobie dwa pytania

  • Kim jesteś ochronę przeciw?

  • Ile jestem gotów zainwestować?

Jeśli chronisz się przed studentem o bardzo ograniczonej wiedzy, który może napisać inną aplikację mobilną, która będzie używać Twojego serwera, masz podpis pod przysięgą.

Jeśli chronisz tylko nieco bardziej wyrafinowanego inżyniera oprogramowania (który może wykonać inżynierię wsteczną aplikacji) - to nie wystarczy. Ten inżynier może wyodrębnić klucz prywatny z aplikacji i użyć go do podpisania żądań w swojej aplikacji.

Możesz przeczytać o zdalnym atestacie here i here.

Rozwiązania, które mogą ochronić Cię przed prostą inżynierią wsteczną, są dość złożone.

P.S. Odnośnie biblioteki RSA.

Spójrz na to dla Androida:

Asymmetric Crypto on Android

A to dla iOS

RSA Encryption using public key

Powiązane problemy