2012-08-30 22 views
6

Opracowuję rozwiązanie dla mojej firmy o następującej architekturze: Usługa sieci Web RESTfull zbudowana na django, która zapewnia warstwę uwierzytelniania i utrwalania zarówno aplikacja klienta WWW i aplikacja klienta mobilnego (która jest napisana przy użyciu phonegap).Uwierzytelnianie aplikacji WWW i mobilnej za pomocą usługi sieciowej RESTfull opartej na django

Szukaliśmy dużo w Internecie na temat metod uwierzytelniania po stronie klienta, zapewniając wsparcie dla aplikacji klienta internetowego i mobilnego, a także z tego, co znaleźliśmy (co jest bardzo słabe), myślimy o wygenerowaniu API klucz dla każdego użytkownika zalogowanego z aplikacji klienta mobilnego i zapisanie tego klucza API w lokalnej pamięci urządzenia; oraz, w kliencie internetowym, przy użyciu tradycyjnego zarządzania sesjami cookie, w tym toksem CSRF w żądaniach POST, PUT i DELETE.

Chcielibyśmy wiedzieć, jakie są najlepsze praktyki w zakresie metod uwierzytelniania i czy to podejście jest wystarczająco dobre? Czy istnieją inne metody radzenia sobie z uwierzytelnianiem? który z nich jest najlepszy?

Próbujemy unieważnić, używając oAuth, ponieważ zwiększa to złożoność naszego rozwoju.

Sprawdziliśmy już this question, ale jego odpowiedzi nie były dla nas zbyt pomocne, ponieważ używamy phonegapa i mamy wspomnianą architekturę.

Dzięki za pomoc!

Odpowiedz

1

Jeśli naprawdę chcesz stworzyć własne rozwiązanie. To moje stare złe rozwiązanie przed czasami OAuth.

  1. Utwórz widok powracających jakiś klawisz po udanym logowaniu się podając nazwę użytkownika/hasło i dodać wygenerowany access_key db
  2. Sprawdź klucz zażądanie => jeśli istnieją w db => Zaloguj

    #pseudo code 
    #view 
    from django.contrib.auth import authenticate, login 
    
    def get_my_token(request, username, password): 
        user = authenticate(username, password) 
        if user is not None: 
         login(request,user) 
         #first should check has access_key 
         try: 
          return UserAuth.objects.filter(user=user).access_key 
         except: 
          pass 
         access_key = 'somecrazy_random_unique_number' 
    
         user_auth = UserAuth() 
         user_auth.user = user 
         user_auth.access_key = access_key 
         user_auth.save() 
         return access_key 
    

Teraz możesz zapisać access_key gdzieś i dodać jako nagłówek "access_key_or_any_other_name" do każdego połączenia, aby przywrócić zasoby. Utwórz oprogramowanie pośredniczące do uwierzytelniania, a nie auth.

#auth_middelware 
    class StupidNoAuthMid(object): 
     def process_request(self, request): 
      access_key = reuest.META['access_key_or_any_other_name']: 
      try: 
       user = UserAuth.objects.filter(access_key=acces_key).user 
       auth.login(request, user) 
      except: 
       pass 

Nie chcesz odkrywać koła od nowa. Użyj oAauth, możesz zapisać access_token na przyszłość.

+0

takie podejście jest podobne do typu/przepływu granicznego poświadczeń klienta OAuth 2.0. –

Powiązane problemy