2010-12-16 11 views
8

Dużo czytam na django-tłokach i używam do tworzenia API dla aplikacji, którą rozwijam, ale odkładam słuchawkę po stronie klienta. Napisałem programy obsługi i mapowania uri i mogę zwrócić JSON lub XML do treści mojego serca. Tam, gdzie utknęłam, jest teraz to, co z tym zrobić.Jaki jest właściwy sposób pisania klienta django-tłokowego?

Moja idealna końcówka polega na tym, aby iPhone i klient Android pobierały i zwracały dane, ale nie znam właściwego sposobu obsługi uwierzytelniania. Najłatwiejszy sposób, w jaki mogę to sobie wyobrazić, to zapisanie nazwy użytkownika i hasła na urządzeniu i oznaczenie go za pomocą każdego tagu, w ostateczności przy użyciu podstawowego uwierzytelniania, ale to jest błędne. Zajrzałem do obsługi tłoków dla OAuth i udało mi się to zrobić przy pomocy this tutorial, ale to też nie wygląda na właściwą odpowiedź. Ostatecznie naprawdę chciałbym mieć prosty monit o nazwę użytkownika i hasło, które zostaną wysłane do Django za pośrednictwem Tłok i REST, a klucz API powróci. Urządzenie będzie przechowywać ten klucz i oznaczać nim wszystkie kolejne żądania. To wydaje się być właściwą drogą, ale nie wiem, jak to zrobić. Czy ktoś może wskazać mi właściwy kierunek?

+0

co jest nie tak z OAuth? – klemens

Odpowiedz

22

Możesz napisać swój własny moduł uwierzytelniania. Oto przykład:

class ApiKeyAuthentication(object): 

    def is_authenticated(self, request): 
     auth_string = request.META.get("HTTP_AUTHORIZATION") 

     if not auth_string: 
      return False 

     key = get_object_or_None(ApiKey, key=auth_string) 

     if not key: 
      request.user = AnonymousUser() 
      return False 

     request.user = key.user 

     return True 

    def challenge(self): 
     resp = HttpResponse("Authorization Required") 
     resp['WWW-Authenticate'] = "Key Based Authentication" 
     resp.status_code = 401 
     return resp 

Musisz model przechowywać mapowanie klawiszy API dla użytkowników:

class ApiKey(models.Model): 
    user = models.ForeignKey(User, related_name='keys') 
    key = models.CharField(max_length=KEY_SIZE) 

Musisz jakiś sposób, aby wygenerować aktualne klucze. Coś jak to będzie działać (powiedzmy, w modelu ApiKey za save metody:

key = User.objects.make_random_password(length=KEY_SIZE) 

while ApiKey.objects.filter(key__exact=key).count(): 
    key = User.objects.make_random_password(length=KEY_SIZE) 

Wreszcie podłączyć swój nowy backend uwierzytelniania:

# urls.py 

key_auth = ApiKeyAuthentication() 

def ProtectedResource(handler): 
    return resource.Resource(handler=handler, authentication=key_auth) 

your_handler = ProtectedResource(YourHandler) 

Co do zamiany nazwy użytkownika/hasła do klucza API, po prostu napisać handler, który używa BasicAuthentication do tworzenia i zwracania nowego ApiKey (dla request.user).

+0

Genialny.Zasadniczo co myślałem, to będzie, więc doceniam, że pisanie to tak konkretnie. ! – eddieroger

Powiązane problemy