2014-12-04 13 views
7

Ho un'applicazione angularjs a pagina singola che utilizza l'autenticazione JWT. Poiché le JWT vengono inviate con ogni singola richiesta, sembra ridondante utilizzare i token CSRF nelle mie forme. Per disabilitare il controllo CSRF, ho commentato 'django.middleware.csrf.CsrfViewMiddleware' nelle mie classi middleware settings.py. Tutto funziona bene.Come si ignorano i token CSRF inviati a Django REST Framework?

Tuttavia, quando utilizzo il pannello di Django Admin, viene utilizzato CSRF. Ciò sembra ragionevole dal momento che le JWT non proteggono le pagine di amministrazione.

Quando accedo ad Admin, viene impostato un cookie contenente il token CSRF. Quando provo a postare POST su REST dalla mia app angularjs durante l'accesso a una sessione di amministrazione, le richieste contengono il cookie CSRF e il backend Django REST respinge il POST con uno stato 403. Se elimino il cookie dalle impostazioni del mio browser e re-POST, viene eseguito come previsto.

Posso configurare la mia app per non impostare i cookie CSRF, ma come configurare la mia app per ignorare il cookie CSRF se è stato impostato da un'altra app sullo stesso dominio? Non posso garantire che un token non venga impostato da qualcos'altro in quanto non controllo tutte le app che verranno eseguite sul dominio.

Sto utilizzando le viste basate sulla classe che estendono le viste nel framework Rango di Django. Ho cercato di risolvere questo problema decorando le mie classi con csrf_exempt, ma questo non sembrava funzionare (otteniamo comunque una risposta 403). Potrei sbagliarmi o c'è qualche altra soluzione che mi manca?

Ecco il mio tentativo di csrf_exempt:

class AccountList(generics.ListCreateAPIView): 
    serializer_class = serializers.AccountSerializer 

    def get_queryset(self): 
     return models.Account.objects.all() 

    @method_decorator(csrf_exempt) 
    def dispatch(self, *args, **kwargs): 
     return super(AccountList, self).dispatch(*args, **kwargs) 
+0

Possibile duplicato di [Django Rest Framework rimuovi csrf] (http://stackoverflow.com/questions/30871033/django-rest-framework-remove-csrf) – user3467349

risposta

13

Sembra che avete SessionAuthentication abilitato, che è la parte di Django REST quadro che impone CSRF per l'autenticazione basata su cookie. Dato che stai usando JWT e hai detto che tutte le pagine usano JWT per l'autenticazione, dovresti riuscire a rimuovere SessionAuthentication dal tuo elenco di classi di autenticazione predefinite.

Se è effettivamente necessario, è possibile spostarlo nella parte inferiore delle classi predefinite. Poiché rileva i cookie di autenticazione e l'autenticazione ha avuto esito positivo, SessionAuthentication avrà esito negativo prima che JWT sia selezionato.

+0

È stato! Grazie! –

Problemi correlati