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 VaporEl 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) // trueProtecció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
ErrorMiddlewareyCORSMiddleware. - Haga que un usuario cumpla
Authenticatable, escriba unAuthenticatory llame areq.auth.login. - Use
Bcryptpara aplicar hashing, proteja las rutas conguardMiddleware()y lea el usuario mediantereq.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
- Enrutamiento y gestión de solicitudes
- Codificación de contenido y JSON
- ORM y modelos con Fluent
- Middleware y autenticación