4 usuarios conectados

Desarrollo web con Python. Autenticación y autorización

Comparte esto

Ahora vamos a abordar un aspecto crítico de la seguridad en aplicaciones web: la autenticación y la autorización. Estos dos conceptos están estrechamente relacionados pero tienen propósitos distintos.

Autenticación: ¿Quién eres?

La autenticación es el proceso de verificar la identidad de un usuario o un servicio. Su objetivo es confirmar que alguien o algo es quien dice ser. En el contexto de una aplicación web, la autenticación típicamente implica que un usuario proporcione credenciales (como un nombre de usuario y una contraseña) para demostrar su identidad al sistema.

Procesos Comunes de Autenticación:

Autorización: ¿Qué permisos tienes?

La autorización es el proceso de determinar qué acciones o recursos puede acceder un usuario autenticado. Una vez que se ha verificado la identidad del usuario (autenticación), la autorización decide si ese usuario tiene permiso para realizar una acción específica o acceder a un recurso en particular.

Mecanismos Comunes de Autorización:

Implementación en Frameworks Web Python:

Los frameworks web Python proporcionan herramientas y extensiones para implementar la autenticación y la autorización:

Flask:

Django:

FastAPI:

Ejemplo Conceptual (Flask):

Python
 
from flask import Flask, request, redirect, url_for
from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user
from werkzeug.security import generate_password_hash, check_password_hash

app = Flask(__name__)
app.config['SECRET_KEY'] = 'tu_clave_secreta'

login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login'  # Ruta para la página de inicio de sesión

class User(UserMixin):
    def __init__(self, id, username, password_hash):
        self.id = id
        self.username = username
        self.password_hash = password_hash

    def check_password(self, password):
        return check_password_hash(self.password_hash, password)

users = {
    1: User(1, 'admin', generate_password_hash('password')),
    2: User(2, 'user', generate_password_hash('userpass'))
}

@login_manager.user_loader
def load_user(user_id):
    return users.get(int(user_id))

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        for user in users.values():
            if user.username == username and user.check_password(password):
                login_user(user)
                return redirect(url_for('protected'))
        return 'Credenciales inválidas'
    return 'Página de inicio de sesión'

@app.route('/logout')
@login_required
def logout():
    logout_user()
    return redirect(url_for('index'))

@app.route('/protected')
@login_required
def protected():
    return f'¡Esta área está protegida! Hola, {current_user.username}'

@app.route('/')
def index():
    return 'Página de inicio'

if __name__ == '__main__':
    app.run(debug=True)

Este ejemplo básico muestra cómo usar Flask-Login para la autenticación y @login_required para la autorización (requiriendo que el usuario esté autenticado para acceder a la ruta /protected).

La implementación adecuada de la autenticación y la autorización es fundamental para la seguridad de cualquier aplicación web. Es importante utilizar prácticas seguras (como el hash de contraseñas, la protección contra ataques CSRF y la validación de tokens) y elegir las herramientas adecuadas que proporciona tu framework web.