0Pricing
Swift Academy · Lección

Middleware y autenticación

Añada lógica transversal y proteja las rutas.

Middleware y autenticación es una lección gratuita de Swift Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Swift Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Swift Academy incluye 4 lecciones en total.

¿Qué es Middleware?

Middleware se sitúa entre la solicitud entrante y el controlador de su ruta, y puede inspeccionar o modificar tanto la solicitud como la respuesta. Es ideal para el registro, CORS, la gestión de errores y la autenticación.

import Vapor

El protocolo Middleware

Un middleware personalizado conforma a AsyncMiddleware e implementa respond(to:chainingTo:). Realiza su trabajo y después llama a next.respond(to:) para continuar la cadena.

struct LogMiddleware: AsyncMiddleware {
    func respond(to req: Request, chainingTo next: AsyncResponder) async throws -> Response {
        req.logger.info("Incoming: " + req.url.path)
        return try await next.respond(to: req)
    }
}

Registro global de Middleware

Añada el middleware a app.middleware para ejecutarlo en cada solicitud. El orden es importante: el middleware se ejecuta en el orden en que se añade.

app.middleware.use(LogMiddleware())

Middleware integrado

Vapor incluye middleware útil: ErrorMiddleware convierte los errores lanzados en respuestas, FileMiddleware sirve archivos estáticos y CORSMiddleware gestiona solicitudes de distintos orígenes.

let cors = CORSMiddleware(configuration: .default())
app.middleware.use(cors)

Middleware específico de una ruta

Aplique middleware únicamente a algunas rutas agrupándolas con él. Las rutas dentro del grupo quedan protegidas; las demás no.

let protected = app.grouped(LogMiddleware())
protected.get("dashboard") { req in "Secret dashboard" }

Conceptos de autenticación

El sistema de autenticación de Vapor tiene dos partes: un modelo Authenticatable (su usuario) y un middleware Authenticator que verifica las credenciales y almacena el usuario en la solicitud.

final class AppUser: Model, Content, Authenticatable {
    static let schema = "users"
    @ID(key: .id) var id: UUID?
    @Field(key: "username") var username: String
    @Field(key: "password_hash") var passwordHash: String
    init() {}
}

Escritura de un autenticador básico

Un AsyncBasicAuthenticator gestiona la autenticación HTTP Basic. Implemente authenticate(basic:for:): busque al usuario, verifique la contraseña y llame a req.auth.login(user) si la autenticación tiene éxito.

struct UserAuthenticator: AsyncBasicAuthenticator {
    func authenticate(basic: BasicAuthorization, for req: Request) async throws {
        guard let user = try await AppUser.query(on: req.db)
            .filter(\.$username == basic.username).first() else { return }
        if try Bcrypt.verify(basic.password, created: user.passwordHash) {
            req.auth.login(user)
        }
    }
}

Hash de contraseñas con Bcrypt

Nunca almacene contraseñas en texto plano. Vapor incluye Bcrypt para generar el hash durante el registro y verificarlo durante el inicio de sesión. El hash es unidireccional; la verificación compara un candidato con el hash almacenado.

let hash = try Bcrypt.hash("s3cret")
let ok = try Bcrypt.verify("s3cret", created: hash) // true

Protección de rutas con un guard

Combine el autenticador con AppUser.guardMiddleware(), que rechaza las solicitudes no autenticadas con un 401. Agrupe las rutas protegidas detrás de ambos.

let protected = app.grouped(
    UserAuthenticator(),
    AppUser.guardMiddleware()
)
protected.get("me") { req -> String in
    let user = try req.auth.require(AppUser.self)
    return user.username
}

Lectura del usuario autenticado

Dentro de un controlador protegido, recupere el usuario que ha iniciado sesión con req.auth.require(_:) (lanza una excepción si no existe) o req.auth.get(_:) (opcional). Así puede limitar los datos al usuario actual.

app.get("profile") { req -> String in
    let user = try req.auth.require(AppUser.self)
    return "Hello, " + user.username
}

Autenticación mediante tokens

En las API, los tokens Bearer son habituales. Un modelo de tokens cumple el protocolo ModelTokenAuthenticatable, lo que permite a Vapor verificar un encabezado Authorization: Bearer ... y cargar automáticamente al usuario asociado.

let tokenProtected = app.grouped(
    UserToken.authenticator(),
    AppUser.guardMiddleware()
)

Comprobación rápida: middleware y autenticación

Confirme que ha comprendido el tema.

Resumen: middleware y autenticación

Ha aprendido a interceptar solicitudes y protegerlas:

  • El middleware (AsyncMiddleware) envuelve las solicitudes; regístrelo globalmente o por grupo de rutas.
  • Use componentes integrados como ErrorMiddleware y CORSMiddleware.
  • Haga que un usuario cumpla Authenticatable, escriba un Authenticator y llame a req.auth.login.
  • Use Bcrypt para aplicar hashing, proteja las rutas con guardMiddleware() y lea el usuario mediante req.auth.require.

Preguntas frecuentes

¿La lección «Middleware y autenticación» es gratis?

Sí — el texto completo de «Middleware y autenticación» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Swift Academy, actualiza a CoddyKit PRO. El curso de Swift Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Middleware y autenticación»?

Añada lógica transversal y proteja las rutas. Practicas Swift Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Swift Academy?

No se requiere experiencia previa. Swift Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Middleware y autenticación»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Swift Academy?

Sí. Cada lección de Swift Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Enrutamiento y gestión de solicitudes
  2. Codificación de contenido y JSON
  3. ORM y modelos con Fluent
  4. Middleware y autenticación
← Volver a Swift Academy