0Pricing
Swift Academy · Lezione

Middleware e autenticazione

Aggiungi logica trasversale e proteggi le route.

Middleware e autenticazione è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Swift Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Swift Academy include 4 lezioni in totale.

Che cos'è il middleware?

Middleware si interpone tra la richiesta in arrivo e il route handler e può esaminare o modificare sia la richiesta sia la risposta. È ideale per il logging, CORS, la gestione degli errori e l'autenticazione.

import Vapor

Il protocollo Middleware

Un middleware personalizzato conforma a AsyncMiddleware e implementa respond(to:chainingTo:). Esegua le operazioni necessarie, quindi chiami next.respond(to:) per continuare la catena.

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)
    }
}

Registrazione globale del middleware

Aggiunga il middleware a app.middleware per eseguirlo a ogni richiesta. L'ordine è importante: i middleware vengono eseguiti nell'ordine in cui sono stati aggiunti.

app.middleware.use(LogMiddleware())

Middleware integrato

Vapor include middleware utili: ErrorMiddleware converte gli errori generati in risposte, FileMiddleware serve file statici e CORSMiddleware gestisce le richieste cross-origin.

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

Middleware specifico per le route

Applichi il middleware solo ad alcune route raggruppandole con esso. Le route all'interno del gruppo saranno protette; le altre no.

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

Concetti di autenticazione

Il sistema di autenticazione di Vapor ha due componenti: un modello Authenticatable (il Suo utente) e un middleware Authenticator che verifica le credenziali e memorizza l'utente nella richiesta.

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() {}
}

Scrittura di un autenticatore Basic

Un AsyncBasicAuthenticator gestisce l'autenticazione HTTP Basic. Implementi authenticate(basic:for:): cerchi l'utente, verifichi la password e, in caso di successo, chiami req.auth.login(user).

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 delle password con Bcrypt

Non memorizzi mai le password in chiaro. Vapor include Bcrypt per generare l'hash durante la registrazione e verificarlo durante l'accesso. L'hashing è unidirezionale; la verifica confronta un candidato con l'hash memorizzato.

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

Protezione delle route con un guard

Combini l'autenticatore con AppUser.guardMiddleware(), che rifiuta le richieste non autenticate con un 401. Raggruppi le route protette dietro entrambi.

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

Lettura dell’utente autenticato

All’interno di un handler protetto, recuperi l’utente autenticato con req.auth.require(_:) (genera un errore se assente) oppure con req.auth.get(_:) (opzionale). In questo modo può limitare i dati all’utente corrente.

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

Autenticazione tramite token

Per le API, i token bearer sono comuni. Un modello di token è conforme a ModelTokenAuthenticatable, consentendo a Vapor di verificare un header Authorization: Bearer ... e caricare automaticamente l’utente associato.

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

Verifica rapida: middleware e autenticazione

Verifichi la propria comprensione.

Riepilogo: middleware e autenticazione

Ha imparato a intercettare e proteggere le richieste:

  • Il middleware (AsyncMiddleware) avvolge le richieste; lo registri globalmente oppure per gruppo di route.
  • Utilizzi componenti integrati come ErrorMiddleware e CORSMiddleware.
  • Renda un utente Authenticatable, scriva un Authenticator e chiami req.auth.login.
  • Esegua l’hashing con Bcrypt, protegga le route con guardMiddleware() e legga l’utente tramite req.auth.require.

Domande Frequenti

La lezione «Middleware e autenticazione» è gratuita?

Sì — il testo completo di «Middleware e autenticazione» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Swift Academy, passa a CoddyKit PRO. Il corso Swift Academy include 4 lezioni in totale.

Cosa imparerò in «Middleware e autenticazione»?

Aggiungi logica trasversale e proteggi le route. Eserciti Swift Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Swift Academy?

Non è richiesta alcuna esperienza precedente. Swift Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Middleware e autenticazione»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Swift Academy?

Sì. Ogni lezione Swift Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Routing e gestione delle richieste
  2. Codifica di contenuti e JSON
  3. ORM Fluent e modelli
  4. Middleware e autenticazione
← Torna a Swift Academy