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.
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:raw_token
).hashed_token
).raw_token
ingresado por el usuario con elhashed_token
obtenido de la base de datos utilizando el métodocheck_password
proporcionado por Django.True
, entonces se ha encontrado el objetoDevice
correcto.Aquí tienes un ejemplo de implementación:
En esta implementación, definimos un método estático
find_device_by_raw_token
en el modeloDevice
que recibe elraw_token
ingresado por el usuario como argumento. El método primero hashea elraw_token
utilizandomake_password
para obtener el token hash correspondiente que se almacena en la base de datos. Luego intenta obtener el objetoDevice
de la base de datos utilizando una consulta en el campotoken
. Si se encuentra un objetoDevice
coincidente, la implementación verifica si elraw_token
ingresado por el usuario coincide con el token hash almacenado en la base de datos utilizando el métodocheck_password
. Si la comparación devuelveTrue
, entonces se ha encontrado el objetoDevice
correcto y se devuelve. Si no se encuentra ningún objetoDevice
coincidente o la comparación falla, el método devuelveNone
.Ten en cuenta que esta implementación asume que el campo
token
en el modeloDevice
siempre se hashea utilizandomake_password
al guardarlo en la base de datos. Si este no es el caso, la implementación puede necesitar ser ajustada en consecuencia.