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
...
ti invitiamo a dare un esempio su come utilizzare questo utilizzando riccio? – momokjaaaaa
@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 –