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.

Cómo obtener un ítem por medio de un CharField con hash en Django.

Tengo un modelo de Device que tiene un campo llamado token que almacena una cadena con hash pbkdf2sha256.

from django.contrib.auth.hashers import make_password
from django.models import Model, CharField
class Device(Model):
    name = CharField(max_length=200)
    token = CharField(unique=True, max_length=128)

    def save(self, *args, **kwargs):
        self.token = make_password(self.token)
        super().save(*args, **kwargs)

Por ejemplo, tengo un objeto Device cuyo token es un valor hash de ABCD. Ahora bien, la pregunta es: si obtengo ABCD del usuario como token en bruto, ¿cómo puedo encontrar el dispositivo correspondiente en la base de datos? He intentado esto:

Hasheé ABCD que obtuve del usuario con make_password, pero el nuevo valor hash no fue el mismo que el antiguo valor que estaba en la base de datos.

También sé que puedo obtener el id del dispositivo del usuario y luego verificar si el token ingresado por el usuario es igual utilizando el método check_password. Pero solo quiero obtener el token del usuario, no el id del dispositivo y el token.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para encontrar un objeto Device en la base de datos utilizando el token sin procesar proporcionado por el usuario, puedes seguir los siguientes pasos:

    1. Obtén el token sin procesar ingresado por el usuario (llamémoslo raw_token).
    2. Obtén el token hash correspondiente de la base de datos utilizando una consulta (llamémoslo hashed_token).
    3. Compara el valor hash del raw_token ingresado por el usuario con el hashed_token obtenido de la base de datos utilizando el método check_password proporcionado por Django.
    4. Si la comparación devuelve True, entonces se ha encontrado el objeto Device correcto.

    Aquí tienes un ejemplo de implementación:

    from django.contrib.auth.hashers import check_password
    from django.models import Model, CharField
    
    class Device(Model):
        name = CharField(max_length=200)
        token = CharField(unique=True, max_length=128)
    
        @staticmethod
        def find_device_by_raw_token(raw_token):
            hashed_token = make_password(raw_token)
            try:
                device = Device.objects.get(token=hashed_token)
                if check_password(raw_token, device.token):
                    return device
            except Device.DoesNotExist:
                pass
            return None
    

    En esta implementación, definimos un método estático find_device_by_raw_token en el modelo Device que recibe el raw_token ingresado por el usuario como argumento. El método primero hashea el raw_token utilizando make_password para obtener el token hash correspondiente que se almacena en la base de datos. Luego intenta obtener el objeto Device de la base de datos utilizando una consulta en el campo token. Si se encuentra un objeto Device coincidente, la implementación verifica si el raw_token ingresado por el usuario coincide con el token hash almacenado en la base de datos utilizando el método check_password. Si la comparación devuelve True, entonces se ha encontrado el objeto Device correcto y se devuelve. Si no se encuentra ningún objeto Device coincidente o la comparación falla, el método devuelve None.

    Ten en cuenta que esta implementación asume que el campo token en el modelo Device siempre se hashea utilizando make_password al guardarlo en la base de datos. Si este no es el caso, la implementación puede necesitar ser ajustada en consecuencia.

Comments are closed.