sessionauthentication password framework default_authentication_classes auth python django django-rest-framework

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("/")