Tengo las siguientes vistas:
login_view :
@api_view(['POST']) def login_view(request): try: user_data = request.data username = user_data["username"] password = user_data["password"] user = authenticate(request, username=username, password=password) if user is not None: login(request, user) serializer = UserSerializer(user) return Response( { "user":serializer.data, "login": True }) else: return Response(serializers.errors, status=status.HTTP_400_BAD_REQUEST) except: raise Http404Cerrar sesión_ver :
@api_view(['POST']) def logout_view(request): if request.user.is_authenticated: logout(request) return Response(status=status.HTTP_200_OK) else: return Response(status=status.HTTP_403_FORBIDDEN)y buscar la función en la interfaz :
const onSubmit = () => { fetch('http://127.0.0.1:8000/api/login/',{ method:"POST", headers: { 'Accept': 'application/json, text/plain', 'Content-Type': 'application/json; charset=UTF-8' }, body: JSON.stringify({ "username": values.Username, "password": values.Password }) }).then((response) => {response.json().then(data => { if(response.ok){ setError(''); console.log(data); } else{ setError(''); setError('Invalid Username or Password'); } })}); };y el siguiente problema:
Cuando intento iniciar sesión en la interfaz, obtengo una respuesta esperada:
{ user: {id: 4, username: 'Tester_1', date_joined: '2021-12-02T22:38:29.323393Z', trust_index: 0} login: true }pero mi usuario no ha iniciado sesión en Rest Framework y no puedo usar la vista de cierre de sesión en Frontend: después de iniciar sesión en Frontend
Cuando uso el panel de Rest Framework para iniciar sesión, todo funciona bien, el usuario inicia sesión y puedo usar la vista de cierre de sesión: Después de iniciar sesión en Rest Framework
He estado luchando con esto por un tiempo. ¿Alguna idea de cómo resolver este problema?
No conozco su código global, pero parece que está tratando de crear un sistema de inicio de sesión/autenticación basado en sesión, trayendo el enfoque del panel web drf generado automáticamente a su frente. En esta estructura separada (anverso y reverso) este no es el mejor enfoque, al menos construyes una estructura extraña donde Django encapsula tu frente y administra sesiones, etc.
Una forma probablemente mejor es usar la generación/autenticación de tokens jwt. Donde se autentica (desde el frente) usando un usuario y contraseña pero recibe (desde atrás) un token que debe almacenar localmente (almacenamiento local, para emular una sesión).
En cada solicitud, pasa el token en el encabezado y, si todo está bien (token válido), drf hace las cosas.
Uso JWT simple ( https://django-rest-framework-simplejwt.readthedocs.io/en/latest/ ). Realmente simple
Aquí hay un ejemplo de urls.py para puntos finales de autenticación:
from django.urls import include, path from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView website_v1 = 'website/v1/' urlpatterns = [ path(f'{website_v1}login/', TokenObtainPairView.as_view(), name='token_obtain_pair'), path(f'{website_v1}login/refresh/', TokenRefreshView.as_view(), name='token_refresh'), ]Y al frente, Axios ( https://axios-http.com/docs/intro ) es una buena biblioteca js para automatizar el paso del token en la obtención de datos mediante interceptores.
¡Buena suerte!