Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

702
Visualizações
La función django.contrib.auth.login() no devuelve a ningún usuario como conectado

Creé una aplicación básica utilizando el sistema de autenticación integrado de Django. Creé con éxito un objeto Usuario en el shell usando >>python manage.py createsuperuser .

Luego creé una vista básica, 'UserLogin' junto con los serializadores/urls correspondientes, para iniciar sesión en un usuario existente usando las funciones django.contrib.auth autenticar() e iniciar sesión(). Al probar con las credenciales de mi usuario creado, la función de inicio de sesión parecía haber funcionado correctamente.

Para probar esto, creé otra función de visualización, 'CurrentUser', que devuelve el nombre de usuario del usuario actualmente conectado. Sin embargo, esta vista devuelve al usuario como vacío.

¿Por qué la vista 'CurrentUser' no devuelve ningún usuario que haya iniciado sesión? He adjuntado mi código (menos las importaciones) a continuación.

vistas.py:

 class UserLogin(APIView): def post(self, request, format = None): serializer = UserLoginSerializer(data=request.data) if serializer.is_valid(): user = authenticate(username=serializer.validated_data["username"], password=serializer.validated_data["password"]) if user is not None: login(request, user) return Response(UserSerializer(user).data, status=status.HTTP_201_CREATED) return Response("Invalid username/password", status=status.HTTP_401_UNAUTHORIZED) return Response(serializer.errors, status=status.HTTP_401_UNAUTHORIZED) class CurrentUser(APIView): def get(self, request, format = None): return Response(self.request.user.username)

serializadores.py:

 class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ['id', 'username'] class UserLoginSerializer(serializers.Serializer): username = serializers.CharField(max_length=300, required=True) password = serializers.CharField(required=True, write_only=True)

urls.py:

 urlpatterns = [ path('login/', views.UserLogin.as_view()), path('current/', views.CurrentUser.as_view()) ]

Cualquier orientación sería muy apreciada.

Gracias

over 4 years ago · Santiago Trujillo
6 Respostas
Responde à pergunta

0

Una causa de esto podría ser la falta de SessionMiddleware :

  1. Su vista /login funciona
  2. Persiste cosas en la sesión pero el middleware no está instalado
  3. La próxima solicitud a /current no está vinculada a la sesión autenticada

¿Puedes verificar que settings.MIDDLEWARES contenga django.contrib.sessions.middleware.SessionMiddleware ?

over 4 years ago · Santiago Trujillo Relatório

0

Estaba intentando probar la autenticación de forma incorrecta. Esta es la API, que no tiene estado . Es decir, Django no tiene idea sobre la solicitud anterior que ha realizado al UserLogin .

Por lo tanto, debe adjuntar el token y la ID de sesión (o algo que pueda usarse para identificar al usuario) con la "segunda solicitud" .

Dado que está utilizando DRF, no tiene que escribir sus propios mecanismos de autenticación. Puede usar la Autenticación básica de DRF (o cualquier otro esquema de autenticación) para autenticarse.

Entonces, cambia tu vista como

 from rest_framework.authentication import BasicAuthentication from rest_framework.permissions import IsAuthenticated class CurrentUser(APIView): authentication_classes = (BasicAuthentication,) permission_classes = (IsAuthenticated,) def get(self, request, format=None): return Response({ "user": { "id": request.user.id, "username": request.user.username }})

Ejecución mediante requests

 In [5]: import requests In [6]: from requests import auth In [7]: response = requests.get(url=url, auth=auth.HTTPBasicAuth("admin", "passme123@#$") ) In [8]: print(response.json()) {'user': {'id': 1, 'username': 'admin'}}

Dado que está utilizando DRF, puede utilizar cualquiera de estos esquemas de autenticación DRF en su base de código

over 4 years ago · Santiago Trujillo Relatório

0

Debe establecer la clase de autenticación predeterminada como clase de autenticación de sesión en la configuración de DRF. Lea más sobre esto aquí [1].

La autenticación de sesión utiliza el ID de sesión para identificar al usuario. Por lo tanto, debe enviar la identificación de sesión basada en cookies en la solicitud. Lea sobre la autenticación de sesión aquí [2].

por ejemplo:

 REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.SessionAuthentication', # <-- set this class ] }

Usa este código:

 def post(self, request, format = None): serializer = UserLoginSerializer(data=request.data) if serializer.is_valid(): user = authenticate(username=serializer.validated_data["username"], password=serializer.validated_data["password"]) if user: return Response(UserSerializer(user).data, status=status.HTTP_201_CREATED) return Response("Invalid username/password", status=status.HTTP_401_UNAUTHORIZED) return Response(serializer.errors, status=status.HTTP_401_UNAUTHORIZED)

Pero mi recomendación es usar Token auth [3].

Para usar token auth 2, las cosas cambiarán:

  1. La clase de autenticación predeterminada en la configuración de DRF
  2. Al enviar una solicitud a cualquier vista de API de DRF, debe enviar el encabezado Auth como Token <token-value>

Su método de publicación y el código de vistas de la API seguirán siendo los mismos.

[1] https://www.django-rest-framework.org/api-guide/authentication/#setting-the-authentication-scheme

[2] https://www.django-rest-framework.org/api-guide/authentication/#sessionauthentication

[3] https://www.django-rest-framework.org/api-guide/authentication/#tokeauthentication

over 4 years ago · Santiago Trujillo Relatório

0

Dado que está utilizando el marco de descanso de Django, supongo que está desarrollando apis de descanso. Rest Apis por diseño está destinado a ser sin estado, lo que significa que no habrá dos solicitudes que dependan entre sí.

Lo que esto significa esencialmente es que debe autenticar cada solicitud y configurar al usuario en la solicitud después de la autenticación.

Hay muchas formas de hacerlo, como muchos han sugerido usar basicAuth, o autenticación basada en token. Todo lo cual podemos implementar fácilmente leyendo la documentaciónAuth Doc

Las vistas de django listas para usar utilizan cookies para identificar al usuario que ha iniciado sesión. Que en este caso no es útil.

over 4 years ago · Santiago Trujillo Relatório

0

Estoy usando DRF para iniciar sesión. Puede verificar estos serializadores y la vista de inicio de sesión.

serializadores.py:

 class LoginSerializer(serializers.Serializer): username = serializers.CharField() password = serializers.CharField() def validate(self, data): user = authenticate(**data) if user and user.is_active: return user raise serializers.ValidationError("Incorrect Credentials")

vista de inicio de sesión:

 class LoginAPIView(generics.GenericAPIView): queryset = User.objects.all() permission_classes = [AllowAny] serializer_class = LoginSerializer def post(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) user = serializer.validated_data return Response({ "user": UserSerializer(user, context=self.get_serializer_context()).data, "token": AuthToken.objects.create(user)[1] })

settings.py clases de marco de descanso:

REST_FRAMEWORK = {

 'DEFAULT_AUTHENTICATION_CLASSES': [ # 'rest_framework.authentication.BasicAuthentication', # 'rest_framework.authentication.SessionAuthentication', 'knox.auth.TokenAuthentication', ], 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly' ], 'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend']

}

over 4 years ago · Santiago Trujillo Relatório

0

Debe adjuntar un token de autenticación y una identificación de sesión para su propósito. Deseo que este documento te sea útil. Te recomiendo que uses Token Auth2. https://www.django-rest-framework.org/api-guide/authentication/#tokeauthentication

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda