2016-02-24 12 views
9

Sto seguendo i documenti DRF per configurare TokenAuthentication e non riesco a farlo funzionare con l'API sfogliabile. Credo di aver aggiunto le linee appropriate in settings.py:Django REST Framework: utilizzo di TokenAuthentication con l'API navigabile

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

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

Così come i token generato per gli utenti esistenti con il frammento di codice dalla documentazione. Posso vedere i token per ciascun utente se interrogo la tabella authtoken_token, quindi so che esistono.

Ogni volta che provo ad accedere al API sfogliabile, ottengo il seguente contenuto restituito:

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

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

Così sembra essere il tentativo token di autenticazione, ma questo messaggio è un po 'strano. Quando inserisco una password errata, viene visualizzato il messaggio "inserisci una password corretta" nel modulo di accesso. Quando inserisco la password corretta, appare il login, ma mi porta alla radice dell'API con il messaggio precedente, e visualizza "Accedi" nel menu in alto, piuttosto che il nome utente.

Questo potrebbe essere correlato al mio modello utente personalizzato in qualche modo? Oppure potrebbe essere dovuto al fatto che attualmente sto sviluppando con il server di sviluppo, che non supporta https- i documenti DRF menzionano la necessità di HTTPS con TokenAuthentication, anche se non ero sicuro se fosse una best practice o effettivamente richiesta .

risposta

11

Non è possibile utilizzare la API navigabile con TokenAuthentication. È necessario aggiungere SessionAuthtication alle impostazioni (http://www.django-rest-framework.org/api-guide/authentication/#sessionauthentication):

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

Credo che le risposte che- grazie! – dkhaupt

+0

Se aggiungo questa autorizzazione, non significa che chiunque effettui una richiesta al mio server acceda solo con nome utente e password (come senza autenticazione token), vero? Credo che funzioni solo per i siti Web, ma volevo esserne sicuro. –

+0

Anche 'rest_framework.authentication.BasicAuthentication' servirebbe allo scopo. Lo preferisco perché idealmente SessionAuthentication dovrebbe essere usato solo quando il tuo server e client sono eseguiti nello stesso contesto come i template di Django. @KutayDemireren: sì, chiunque abbia un nome utente/password e l'autorizzazione appropriata avrà accesso alle API. Ma sta a te pubblicare o meno l'endpoint dell'API. –