2013-02-14 15 views
8

Buduję aplikację mobilną z wieloma platformami (przy użyciu narzędzi Xamarian, MonoTouch/MonoDroid). Próbuję przepracować proces uwierzytelniania i napotykam przeszkodę. Przeszukałem wszystko, by uzyskać jasną odpowiedź i muszę ją jeszcze znaleźć."Właściwy" sposób na wykonanie OAuth z klienta mobilnego

Oto przegląd mojej obecnej konfiguracji.

Mam stronę internetową zbudowaną w nodejs. Używam pliku passport.js do logowania się na OAuth na stronie internetowej. Działa to świetnie, użytkownicy mogą zalogować się do mojej witryny za pomocą Twittera lub Facebooka.

Teraz chcę rozszerzyć tę samą funkcję logowania do moich klientów mobilnych.

widzę 2 opcje

  1. osadzić app i id app sekret jest w klientów mobilnych i dokonać bezpośredniego OAuth wywołań FB czy Twitter z aplikacji mobilnej

  2. Proxy OAuth wywołań mój istniejących nodejs serwer wWW (utrzymanie tajnych kluczy na serwerze)

Wariant 2 wydaje się być najlepszym sposobem (jak to unika konieczności „statek” THE Sekretariatu t w aplikacjach mobilnych).

Mam podejście proxy działające.

  1. otworzyć WebView w moim mobilnym klientem i skierować go na http://mysever/auth/twitter
  2. biegnie To przez mojego kodu istniejące passport.js i przekierowuje mobilnej WebView nad do strony logowania Twittera.
  3. Użytkownik następnie wprowadza swoje uprawnienia na stronie internetowej Twittera na urządzeniu.
  4. Twitter następnie wywołuje mój URL wywołania zwrotnego oAuth (który jest moim serwerem sieciowym nodejs).
  5. Mój serwer i Twitter zajmują się handlem w czwartek, uzyskując informacje o profilu użytkownika (Jak rozumiem, jest to kluczem do tego podejścia, mój serwer i Twitter obsługują uścisk dłoni, klient mobilny nie musi niczego lub przekazać wszelkie znaki podczas tego procesu)

Oto mój problem:

  1. to właśnie ten ostatni krok, który mnie kikuty. Po zakończeniu uścisk na moim serwerze Mam informacje o użytkowniku muszę na serwerze i trzeba wysłać go z powrotem do aplikacji klienta mobilnego

    nie mogę wymyślić żadnego sposobu kontroli WebView chwycić obiekt odpowiedzi i pobierz plik cookie lub wartość nagłówka (na przykład) (wydaje się to prawdą w przypadku systemu Android i iOS). Nie sądzę, że jest to specyficzne dla platformy. Myślę, że próbuję zrobić coś, czego widget WebView na platformach mobilnych po prostu nie obsługuje. To sprawia, że ​​myślę, że brakuje mi czegoś oczywistego.

Jedyne co zorientowali się, to mój serwer WWW „przekierować” przeglądarkę klienta mobilnego do fałszywego adresu URL, który ma Informacja o użytkowniku w ciągu kwerendy. Coś takiego jak myapp: // info? Userid = 1234

Następnie w aplikacji mobilnej mogę przejąć adres URL i pobrać ten URL i uzyskać potrzebne dane. Mogę następnie przechować te informacje o użytkowniku, zamknąć kontrolkę WebView i przejść do natywnego ekranu w mojej aplikacji mobilnej i użytkownik userinfo w każdym kolejnym wywołaniu REST do mojego serwera nodejs, aby zidentyfikować użytkownika.

Jest to bardzo kludgy z wielu powodów. Największym z nich jest to, że adres URL jest wysyłany przez przewód niezaszyfrowany i ma wszystkie dane w postaci zwykłego tekstu.

Musi istnieć lepszy sposób na przeniesienie danych z serwera WWW do klienta mobilnego?

Czy robię to wszystko źle?

+0

jakie podejście czy wreszcie osiąść na? Utknąłem w tym samym dylemacie, że opcja 2 jest podejściem idealistycznym. –

+0

Szczerze mówiąc, nigdy nie znalazłem rozwiązania, które działałoby dobrze. Ogólnie przyjętą rzeczą wydaje się wysłanie sekretu w aplikacji mobilnej. Wydaje się, że ludzie upychają go w aplikacji i nie przejmują się tym zbytnio. –

+0

Ktoś, kto czuje się po prostu jak OAuth, jest kompletnym bałaganem interpretacji i pół implementacji? – Jammer

Odpowiedz

3

Najprostszym sposobem wdrożenia oauth dla Xamarin, zarówno dla systemów iOS, jak i Android, jest użycie Xamarin.Auth. Dokumentacja startowa dla klienta to here. Myślę, że powinno to wszystko utrzymać bezpiecznie i nie będziesz musiał się martwić o to, że będziesz musiał używać serwera węzła jako serwera proxy.

Będziesz musiał podać swój identyfikator aplikacji w ramach połączeń, ale nie ma zbyt wielu lub żadnych problemów związanych z bezpieczeństwem.

Wiem, że to jest sprzeczne z tym, co już zaimplementowałeś, ale może to może trochę uprościć sytuację.

+0

Interesujące, nie widziałem tej biblioteki. dzięki za link. Wygląda na to, że jest to w zasadzie to samo, co oferuje RestSharp (co jest faktycznie moją opcją 1). W przypadku oAuth1 (Twitter) myślę, że to oznacza, że ​​będę musiał umieścić mój tajny element aplikacji w mobilnym pakiecie wdrażania? –

+1

Ah, tak, RestSharp ma taką samą funkcjonalność OAuth. W przypadku OAuth1 nie ma wielu świetnych opcji. Albo osadzaj, albo idź na proxy, tak jak to, co zacząłeś. Jeśli umieścisz na swojej stronie, możesz zamaskować klucze lub spróbować przechowywać je w bezpiecznym miejscu, ale nie ma gwarancji, że nie zostaną skradzione. Myślę, że ten post jest dość dobrym przeglądem na ten temat: http://stackoverflow.com/questions/1934187/oauth-secrets-in-mobile-apps. –

+0

Tak, czytałem ten wątek. Ale tak naprawdę nie ma oferowanego rozwiązania. Poza tym, że oAuth nie jest właściwym rozwiązaniem dla aplikacji klienckich. Coraz częściej myślę, że po prostu puntowanie o OAuth jest lepszym rozwiązaniem dla aplikacji mobilnych. –

0

To ten sam dylemat, z którym miałem do czynienia. Tak właśnie radzę sobie z tym. W mojej aplikacji klient może przyjść bezpośrednio lub za pośrednictwem innej usługi, takiej jak Facebook, który jest moim głównym, a więc tym, na którym się skoncentrowałem.

Facebook może przekierowywać za pośrednictwem POST (aplikacje biurowe) lub GET (mobilne).

Sprawdzam początkowe żądanie, więc zobacz, czy ma identyfikator usługi - tutaj jest facebook GET na przykład.

app.get('/', function(req, res) { 
var paraUrl = URL.parse(req.url,true).query; 
//The fb_source is shown - 
//i need to go striaght to the facebook authorization since 
//its coming from 
//from a mobile device. 
if (paraUrl.fb_source){ 
res.redirect('/auth/facebook'); //this is the passport part 
return; 
} 
res.sendfile('index.html'); 
} 

Facebook POST nieznacznie różni się tym, że masz token dostępu kodowanie w base64url. GET daje kod, który można wymienić na token dostępu, ale miałem problemy z nim i po prostu zdecydowałem się na przywiązanie do systemu paszportowego.

Jeśli klient przychodzi bezpośrednio, sprawdzam sesję lub zaszyfrowane pliki cookie, które są powiązane ze strategią lokalną. Następnie sprawdza bazę danych dla tokenu dostępu, który może służyć np. Do uzyskania dostępu do facebookowego interfejsu API.

Jeśli klient jest nierozpoznane są one podane opcję uwierzytelniania poprzez facebook, google itp

Najważniejsze jest to, że tylko 2 kawałki są przechowywane informacje o kliencie, identyfikator sesji paszport i mojej aplikacji użytkownik id

połączyć.SID - encypted cookies

userId - encypted cookies

byłbym zainteresowany, aby dowiedzieć się, jak inni ludzie mają do czynienia z emisji

+0

W jaki sposób otrzymujesz connect.sid i userid z powrotem do aplikacji mobilnej? Czy w jakiś sposób można pobrać obiekt odpowiedzi z przeglądarki mobilnej? –

+0

Są one ustawiane za pomocą zaszyfrowanych plików cookie, dlatego są zwracane dla każdego żądania. Parametr connect.sid jest dobry tylko dla długości aplikacji, ale ustawiłem identyfikator mojego użytkownika na dwa tygodnie. –

+0

Czy jesteś w stanie dostać się do obiektu jar Cookie i wyciągnąć zaszyfrowany plik cookie z widżetu przeglądarki (WebView) lub czy pozostajesz w kontekście przeglądarki na czas trwania swojego klienta mobilnego? –

Powiązane problemy