2015-09-29 33 views

risposta

0

Nella cartella che contiene i file API, creare un altro file per contenere la classe di autenticazione personalizzata, ad esempio authentication.py. Quindi, nelle impostazioni, sotto DEFAULT_AUTHENTICATION_CLASSES, scegliere la classe di autenticazione personalizzata.

8

Come implementare uno schema di autenticazione personalizzato in DRF?

Per implementare uno schema di autenticazione personalizzato, è necessario creare una sottoclasse della classe BaseAuthentication del DRF e sovrascrivere il metodo .authenticate(self, request).

Il metodo deve restituire una coppia di due tuple di (user, auth) se l'autenticazione ha esito positivo oppure None in caso contrario. In alcune circostanze, è possibile che si verifichi un'eccezione AuthenticationFailed dal metodo .authenticate().

Esempio (da DRF docs):

Diciamo che vogliamo autenticare ogni richiesta in arrivo come l'utente proposta dal username in una richiesta di intestazione personalizzata denominata 'X_USERNAME'.

Step-1: Creare la classe di autenticazione personalizzati

Per fare questo, abbiamo creerà un file authentication.py in my_app.

# my_app/authentication.py 
from django.contrib.auth.models import User 
from rest_framework import authentication 
from rest_framework import exceptions 

class ExampleAuthentication(authentication.BaseAuthentication): 
    def authenticate(self, request): 
     username = request.META.get('X_USERNAME') # get the username request header 
     if not username: # no username passed in request headers 
      return None # authentication did not succeed 

     try: 
      user = User.objects.get(username=username) # get the user 
     except User.DoesNotExist: 
      raise exceptions.AuthenticationFailed('No such user') # raise exception if user does not exist 

     return (user, None) # authentication successful 

Step-2: specificare la classe di autenticazione personalizzato

Dopo aver creato la classe di autenticazione personalizzato, abbiamo bisogno di definire questa classe di autenticazione nelle nostre impostazioni DRF. In questo modo, tutte le richieste verranno autenticate in base a questo schema di autenticazione.

'DEFAULT_AUTHENTICATION_CLASSES': (  
    'my_app.authentication.ExampleAuthentication', # custom authentication class 
    ... 
), 

Nota: Se si desidera utilizzare questa classe di autenticazione personalizzato sulla base per-view o per-viewset base e non a livello globale, è possibile definire questa classe di autenticazione in modo esplicito nel vostro punto di vista.

class MyView(APIView): 

    authentication_classes = (ExampleAuthentication,) # specify this authentication class in your view 

    ... 
+0

ti invitiamo a dare un esempio su come utilizzare questo utilizzando riccio? – momokjaaaaa

+1

@momokjaaaaa Controlla questo link SO per l'invio di intestazioni in una richiesta POST. http://stackoverflow.com/questions/356705/how-to-send-a-header-using-a-http-request-through-a-curl-call –

3

Bellow è un semplice esempio che può essere utilizzato per ottenere un'autenticazione personalizzata. Nell'esempio per accedere all'endpoint è necessario passare la password del nome utente & sui dati POST.

urls.py

urlpatterns = [ 
    url(r'^stuff/', views.MyView.as_view()), 
    ... 
] 

vista.py

from django.contrib.auth.models import User 
    from rest_framework import viewsets 
    from rest_framework.response import Response 
    from rest_framework.views import APIView  
    from rest_framework.permissions import IsAuthenticated 
    from rest_framework import exceptions 
    from rest_framework import authentication 
    from django.contrib.auth import authenticate, get_user_model 
    from rest_framework.authentication import BasicAuthentication, 
SessionAuthentication 


class ExampleAuthentication(authentication.BaseAuthentication): 

    def authenticate(self, request): 

     # Get the username and password 
     username = request.data.get('username', None) 
     password = request.data.get('password', None) 

     if not username or not password: 
      raise exceptions.AuthenticationFailed(_('No credentials provided.')) 

     credentials = { 
      get_user_model().USERNAME_FIELD: username, 
      'password': password 
     } 

     user = authenticate(**credentials) 

     if user is None: 
      raise exceptions.AuthenticationFailed(_('Invalid username/password.')) 

     if not user.is_active: 
      raise exceptions.AuthenticationFailed(_('User inactive or deleted.')) 


    return (user, None) # authentication successful 


class MyView(APIView): 
    authentication_classes = (SessionAuthentication, ExampleAuthentication,) 
    permission_classes = (IsAuthenticated,) 

    def post(self, request, format=None):  
     content = { 
      'user': unicode(request.user), 
      'auth': unicode(request.auth), # None 
     } 
     return Response(content) 

Curl

curl -v -X POST http://localhost:8000/stuff/ -d 'username=my_username&password=my_password' 
Problemi correlati