python - default_authentication_classes - django rest framework reset password
Fracaso exento de CSRF-APIView csrf django rest framework (3)
En realidad, una mejor forma de deshabilitar la comprobación de csrf dentro de SessionAuthentication es:
from rest_framework.authentication import SessionAuthentication as OriginalSessionAuthentication
class SessionAuthentication(OriginalSessionAuthentication):
def enforce_csrf(self, request):
return
Tengo el siguiente código:
El problema es cuando intento acceder al inicio de sesión del usuario / me sale un error: "Error de CSRF: cookie CSRF no configurada".
¿Que puedo hacer?
Estoy usando el marco de descanso django.
urls.py:
url(r''^user-login/$'',
csrf_exempt(LoginView.as_view()),
name=''user-login''),
views.py:
class LoginView(APIView):
"""
List all snippets, or create a new snippet.
"""
def get(self, request, format=None):
startups = Startup.objects.all()
serializer = StartupSerializer(startups, many=True)
return Response(serializer.data)
def post(self, request, format=None):
profile = request.POST
if (''user_name'' not in profile or ''email_address'' not in profile or ''oauth_secret'' not in profile):
return Response(
{''error'': ''No data''},
status=status.HTTP_400_BAD_REQUEST)
username = ''l'' + profile[''user_name'']
email_address = profile[''email_address'']
oauth_secret = profile[''oauth_secret'']
password = oauth_secret
La forma más fácil de resolver este problema:
Para eso hay dos formas de autenticación en drf see drf auth
BasicAuthentication
SessionAuthentication (predeterminado)
SessionAuthentication tiene una comprobación de csrf forzada, pero BasicAuthentication no. Así que mi camino es usar BasicAuthentication en mi vista en lugar de SessionAuthentication.
from rest_framework.authentication import BasicAuthentication
class UserLogin(generics.CreateAPIView):
permission_classes = (permissions.AllowAny,)
serializer_class = UserSerializer
authentication_classes = (BasicAuthentication,)
def post(self, request, *args, **kwargs):
return Response({})
Supongo que utilizas el marco de trabajo de repositorio django SessionBackend . Este backend hace un chequeo implícito de CSRF
Puedes evitar esto por:
from rest_framework.authentication import SessionAuthentication
class UnsafeSessionAuthentication(SessionAuthentication):
def authenticate(self, request):
http_request = request._request
user = getattr(http_request, ''user'', None)
if not user or not user.is_active:
return None
return (user, None)
Y configure esto como authentication_classes en su vista
class UnsafeLogin(APIView):
permission_classes = (AllowAny,) #maybe not needed in your case
authentication_classes = (UnsafeSessionAuthentication,)
def post(self, request, *args, **kwargs):
username = request.DATA.get("u");
password = request.DATA.get("p");
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
return redirect("/")