2016-02-24 15 views
9

Podążam za dokumentami DRF, aby skonfigurować tokenowanie TokenAuthentication, i nie mogę uruchomić go z interfejsem API do przeglądania. Wierzę Dodałem odpowiednie linie w settings.py:Django REST Framework: używanie TokenAuthentication z możliwym do przeglądania interfejsem API

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

INSTALLED_APPS = (
    ... 
'rest_framework', 
'rest_framework.authtoken', 
    ... 

Jak również wygenerowanych tokenów dla istniejących użytkowników z fragmentem kodu z docs. Widzę tokeny dla każdego użytkownika, jeśli zapytanie o tabelę authtoken_token, więc wiem, że istnieją.

Everytime próbuję zalogować się do interfejsu API do przeglądania, pojawia się następujący treść powrócił:

HTTP 401 Unauthorized 
Allow: GET, HEAD, OPTIONS 
Content-Type: application/json 
Vary: Accept 
WWW-Authenticate: Token 

{ 
"detail": "Authentication credentials were not provided." 
} 

Więc wydaje się być próbą token uwierzytelniania, ale ta wiadomość jest trochę dziwne. Gdy wprowadzam niepoprawne hasło, otrzymuję komunikat "Wprowadź poprawne hasło" w formularzu logowania. Kiedy wpisuję poprawne hasło, wydaje się, że loguję, ale przenosi mnie do katalogu głównego API z powyższym komunikatem i wyświetla "Zaloguj się" w górnym menu, a nie nazwę użytkownika.

Czy to może być związane z moim niestandardowym modelem użytkownika? Czy może to wynikać z faktu, że aktualnie rozwijam się na serwerze dev, który nie obsługuje https - dokumenty DRF wspominają o konieczności używania HTTPS z TokenAuthentication, chociaż nie byłem pewien, czy to była najlepsza praktyka, czy faktycznie wymagana .

Odpowiedz

11

Nie można używać interfejsu API do przeglądania z TokenAuthentication. Trzeba dodać SessionAuthtication z ustawieniami (http://www.django-rest-framework.org/api-guide/authentication/#sessionauthentication):

REST_FRAMEWORK = { 
'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.TokenAuthentication', 
    'rest_framework.authentication.SessionAuthentication', 
), 
+0

Myślę, że odpowiedzi że- dziękuję! – dkhaupt

+0

Jeśli dodaję to uwierzytelnienie, nie oznacza to, że każdy, kto zgłosi żądanie do mojego serwera, uzyska dostęp tylko za pomocą nazwy użytkownika i hasła (jak bez autoryzacji tokenów), prawda? Po prostu działa na stronach internetowych, ale chciałem mieć pewność. –

+0

Nawet "rest_framework.authentication.BasicAuthentication" będzie służyć temu celowi. Preferuję to, ponieważ idealna SessionAuthentication powinna być używana tylko wtedy, gdy twój serwer i klient działają w tym samym kontekście, jak szablony django. @KutayDemireren - tak każdy, kto ma nazwę użytkownika/hasło i odpowiednie uprawnienie, będzie miał dostęp do interfejsów API. Ale do góry możesz opublikować punkt końcowy API, czy nie. –

Powiązane problemy