Signup

Clase 31 de 36Curso de Flask

Resumen

¿Cómo implementar el registro de usuarios con encriptación de contraseñas?

Atreverse con la implementación de un sistema de registro de usuarios que además garantice la seguridad de las contraseñas es un paso imprescindible en el desarrollo de aplicaciones web. En este contenido, abordamos cómo utilizar una ruta de registro con validaciones específicas y cómo asegurar las contraseñas de los usuarios mediante técnicas de hashing. Estas herramientas son esenciales para garantizar la seguridad de los datos y la integridad del sistema.

¿Cómo se estructura la ruta de registro?

Para implementar la funcionalidad de registro (o "signup"), el primer paso es definir una nueva ruta en nuestra aplicación. Utilizaremos la misma forma de autenticación que para el login, pero incluiremos validaciones diferentes y almacenaremos el usuario en la base de datos de manera segura.

@auth.route('/signup', methods=['GET', 'POST'])
def signup():
    form = SignupForm()
    # Implementación de lógica de validación y creación de usuario

¿Por qué es importante hashear las contraseñas?

Hashear las contraseñas antes de almacenarlas es crucial para la seguridad. Nunca se deben guardar las contraseñas tal cual las ingresa el usuario. De modo que antes de guardarlas, se les aplica un proceso de hash que convierte la contraseña en un string encriptado. Solo el usuario debe saber su contraseña original.

Para hashear contraseñas, podemos utilizar la librería werkzeug.security:

from werkzeug.security import generate_password_hash

password_hash = generate_password_hash(password)

¿Cómo se valida y crea un nuevo usuario?

El proceso de creación del usuario involucra varios pasos. Primero, se valida si el nombre de usuario ya existe para evitar duplicidad. Si no existe, se procede a encriptar la contraseña y finalmente, almacenar al nuevo usuario en la base de datos.

if signup_form.validate_on_submit():
    username = signup_form.username.data
    password = signup_form.password.data
    
    user_doc = get_user(username)

    if user_doc.to_dict() is None:
        password_hash = generate_password_hash(password)
        user_data = UserData(username, password_hash)
        user_put(user_data)
        
        flash('¡Bienvenido!')
        return redirect(url_for('hello'))
    else:
        flash('El usuario ya existe.')

¿Cómo almacenar con seguridad en Firestore?

Al usar Google Firestore, se pueden guardar los datos del usuario en una base de datos noSQL. Para evitar duplicaciones, solo almacenaremos el hash de la contraseña. La función user_put maneja esta parte del proceso.

def user_put(user_data):
    user_ref = db.collection('users').document(user_data.username)
    user_ref.set({
        'password': user_data.password
    })

¿Qué sucede después de registrar al usuario?

Una vez que el usuario ha sido creado y registrado correctamente, se le redirige a la página principal de la aplicación. Además, si el proceso ha sido exitoso, el sistema envía un mensaje de bienvenida para confirmar el registro.

user_model = UserModel(user_data)
session['username'] = user_model.username
flash('¡Bienvenido, ' + user_model.username + '!')
return redirect(url_for('hello'))

En conclusión, almacenar usuarios de manera segura es un proceso metodológico que requiere atención a la validación de datos y la encriptación de contraseñas, protegiendo así la información personal. Si te entusiasma seguir profundizando en técnicas avanzadas, te animamos a implementar formularios y funcionalidades adicionales para enriquecer la experiencia del usuario. ¡La próxima clase exploraremos cómo añadir tareas para usuarios registrados!