es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Drf cómo hacerlo: authenticating con simple-jwt sin usar el USERNAME_FIELD

He ampliado TokenObtainPairSerializer, el modelo del usuario tiene el campo de correo electrónico como USERNAME_FIELD, pero este tipo de usuario no tiene un correo electrónico, en su lugar quiero usar un ID único generado automáticamente para autenticarse en lugar del correo electrónico.

class MyTokenStudentSerializer(TokenObtainPairSerializer):
    def validate(self, attrs):
        user = authenticate()(
            student_id=attrs['student_id'], password=attrs['password'])
        if user is not None:
            if user.is_active:
                data = super().validate(attrs)
                refresh = self.get_token(self.user)
                refresh['student_id'] = self.user.student_id
                try:
                    data["refresh"] = str(refresh)
                    data["access"] = str(refresh.access_token)
                    data['student_id'] = self.user.student_id
                    data['firstname'] = self.user.firstname
                    data['middlename'] = self.user.middlename
                    data['lastname'] = self.user.lastname
                    data['phone'] = self.user.phone
                    data['last_login'] = self.user.last_login
                    data['joined_date'] = self.user.joined_date
                except Exception as e:
                    raise serializers.ValidationError(
                        {'error': '¡Algo salió mal!'})
                return data
            else:
                raise serializers.ValidationError(
                    {'error': 'La cuenta no está activada'})
        else:
            raise serializers.ValidationError({
                'error': '¡Combinación incorrecta de identificación de estudiante y contraseña!'})

Aunque no paso un campo de correo electrónico, esto toma el correo electrónico y la contraseña, ¿cómo hago para que tome el ID de estudiante en lugar del correo electrónico?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para hacer que el serializador use el student_id en lugar del correo electrónico para la autenticación, deberás cambiar el método get_token y reemplazar cualquier referencia a self.user.email por self.user.student_id.

    Aquí tienes un ejemplo de cómo puedes modificar la clase MyTokenStudentSerializer para utilizar el student_id en lugar del correo electrónico para la autenticación:

    class MyTokenStudentSerializer(TokenObtainPairSerializer):
        @classmethod
        def get_token(cls, user):
            token = super().get_token(user)
            # reemplazar correo electrónico por student_id
            token['student_id'] = user.student_id
            return token
    
        def validate(self, attrs):
            user = authenticate()(
                student_id=attrs['student_id'], password=attrs['password'])
            if user is not None:
                if user.is_active:
                    data = super().validate(attrs)
                    refresh = self.get_token(self.user)
                    # reemplazar correo electrónico por student_id
                    refresh['student_id'] = self.user.student_id
                    try:
                        data["refresh"] = str(refresh)
                        data["access"] = str(refresh.access_token)
                        data['student_id'] = self.user.student_id
                        data['firstname'] = self.user.firstname
                        data['middlename'] = self.user.middlename
                        data['lastname'] = self.user.lastname
                        data['phone'] = self.user.phone
                        data['last_login'] = self.user.last_login
                        data['joined_date'] = self.user.joined_date
                    except Exception as e:
                        raise serializers.ValidationError(
                            {'error': '¡Algo salió mal!'})
                    return data
                else:
                    raise serializers.ValidationError(
                        {'error': 'La cuenta no está activada'})
            else:
                raise serializers.ValidationError({
                    'error': '¡Combinación incorrecta de identificación de estudiante y contraseña!'})
    

    Puedes ver que hemos agregado un método get_token que reemplaza el de la superclase para cambiar user.email por user.student_id. Esto asegurará que el token generado por el serializador contenga la información correcta.

    Ten en cuenta que, dependiendo de los detalles de tu proyecto de Django, es posible que debas realizar cambios adicionales en otras partes del código para garantizar que el proceso de autenticación y autorización funcione como se espera.

Comments are closed.