2013-07-09 15 views
30

Mam projekt django, używając django-rest-framework do tworzenia interfejsu API.Jak używać TokenAuthentication dla API w django-rest-framework

Chcesz użyć systemu uwierzytelniania z podstawą tokena, aby wywołanie api (wstawianie, wysyłanie, usuwanie) było wykonywane tylko dla autoryzowanego użytkownika.

Zainstalowałem "rest_framework.authtoken" i utworzyłem token dla każdego użytkownika.

Teraz, od django.contrib.auth.backends authenticate, zwraca użytkownika, z auth_token jako atrybutem. (po pomyślnym zalogowaniu).

Teraz moje pytanie brzmi: jak mogę wysłać token z prośbą o wpis do mojego api i po stronie api jak mogę sprawdzić, czy token jest ważny i należy do właściwego użytkownika?

Czy w aplikacji rest_framework.authtoken istnieją jakieś metody sprawdzania poprawności danego użytkownika i jego tokena? Nie znaleziono this Bardzo przydatne!

aktualizacji (zmiany zrobiłem): dodanych w tym w moim settings.py:

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.BasicAuthentication', 
     'rest_framework.authentication.SessionAuthentication', 
     'rest_framework.authentication.TokenAuthentication', 
    ) 
} 

także wysyłania token w moim nagłówku, ale jej jeszcze nie działa:

if new_form.is_valid: 
    payload= {"createNewUser": 
       { "users": request.POST["newusers"], 
       "email": request.POST["newemail"] 
       } 
       } 

    headers = {'content-type' : 'application/json', 
       'Authorization': 'Token 6b929e47f278068fe6ac8235cda09707a3aa7ba1'} 

    r = requests.post('http://localhost:8000/api/v1.0/user_list', 
         data=json.dumps(payload), 
         headers=headers, verify=False) 
+0

Zasadniczo duplikat: http://stackoverflow.com/ pytania/14838128/django-rest-framework-token-authentication – jdero

+0

nop, że post tylko mówi o tworzeniu tokenów - skończyłem z tą częścią, a teraz chcę wiedzieć, jak przekazać token przez żądanie HTTP i jak zweryfikować dany użytkownik i jego token. Żadne ciało nie mówi o tej części. – Peter

+1

Jest to bardzo dobrze udokumentowane w dokumentacji django-rest-framework. Po stronie klienta dodajesz nagłówek do wszystkich żądań HTTP, a django-rest-framework robi resztę po stronie serwera. Jeśli podałeś poprawny token, będziesz mieć poprawnego użytkownika jako request.user – jasisz

Odpowiedz

31

„jak czy mogę wysłać token z prośbą o dodanie do mojego api "

Od t on docs ...

Aby klienci uwierzytelniali się, klucz tokenu powinien być zawarty w nagłówku HTTP autoryzacji. Klucz powinien być poprzedzony literowym ciągiem "Token", z białymi spacjami oddzielającymi dwa ciągi. Na przykład: „na stronie api jak mogę sprawdzić, czy znak jest ważny i należy do właściwego użytkownika”

Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b 

Nie musisz nic robić, wystarczy dostęp request.user wrócić uwierzytelnionego użytkownika - ramy reszta będzie radzić sobie z powrotem do „401” Nieautoryzowany odpowiedź na każdej błędnej identyfikacji.

+1

Jeśli żądanie jest przekierowywane, upewnij się, że token jest wysyłany zarówno na początkowe żądanie, jak i na kolejne przekierowane żądanie. –

+0

"just access request.user, aby zwrócić uwierzytelnionego użytkownika". doktorzy powiedzieli tę samą "odpowiedź zwrotną (treść)", ale ja już zwróciłem mój widok lub cokolwiek chcę pokazać na stronie api. jak mogę zwrócić oba? – Peter

+0

wow nevermind Dodałem "użytkownika": unicode (request.user) i "auth": unicode (request.auth) z moim istniejącym zwrotem i jego działaniem. Ale musiałem ponownie przetworzyć moją prośbę (auth_token), ponieważ używam przekierowania między szablonami. Dzięki wszystkim :) – Peter

1

W końcu mam pakiet django "rest-auth" do uwierzytelniania tokenu. Jeśli to nie pomaga, jest tu po stronie klienta kodu jQuery, który pracował dla mnie, po pomyślnym zalogować się i otrzymać „auth_token”:

var user_url = {API URL}/rest-auth/login 
var auth_headers = { 
    Authorization: 'Token ' + auth_token 
} 
var user_ajax_obj = { 
    url : user_url, 
    dataType : 'json', 
    headers: auth_headers, 
    success : function(data) { 
    console.log('authorized user returned'); 
    }, 
    error: function(XMLHttpRequest, textStatus, errorThrown) { 
    console.log('error returned from ' + user_url); 
    } 
}; 
$.ajax(
    user_ajax_obj 
); 
3

Aby odpowiedzieć na pierwszą połowę zapytanie:

jak mogę wysłać token z prośbą do mojego postu api

można użyć biblioteki Python requests.Dla TokenAuthentication django-rest-ramowej, token musi być przekazywane w nagłówku i poprzedzony ciągiem Token (see here):

import requests 
mytoken = "4652400bd6c3df8eaa360d26560ab59c81e0a164" 
myurl = "http://localhost:8000/api/user_list" 

# A get request (json example): 
response = requests.get(myurl, headers={'Authorization': 'Token {}'.format(mytoken)}) 
data = response.json() 

# A post request: 
data = { < your post data >} 
requests.post(myurl, data=data, headers={'Authorization': 'Token {}'.format(mytoken)}) 
Powiązane problemy