🚀 Nuova versione beta disponibile! Feedback o problemi? Contattaci

Autenticazione in Express.js con Passport.js

Codegrind Team•Aug 28 2024

L’autenticazione è una parte cruciale di molte applicazioni web, e Express.js, uno dei framework Node.js più popolari, offre vari strumenti per implementarla. Passport.js è una delle librerie più utilizzate per l’autenticazione in applicazioni Node.js grazie alla sua flessibilità e alla vasta gamma di strategie di autenticazione disponibili. In questa guida, esploreremo come configurare e implementare l’autenticazione in un’applicazione Express.js utilizzando Passport.js.

Cos’è Passport.js?

Passport.js è una libreria middleware per Node.js che semplifica l’autenticazione degli utenti in applicazioni web. Passport supporta oltre 500 strategie di autenticazione, inclusi login tramite username e password, OAuth (ad esempio, login con Google, Facebook), e altro.

Perché Usare Passport.js?

  • Modularità: Passport.js è progettato per essere modularizzato, consentendo di aggiungere facilmente nuove strategie di autenticazione.
  • Facilità di Integrazione: Si integra facilmente con Express.js grazie alla sua architettura middleware.
  • Ampio Supporto: Supporta una vasta gamma di strategie di autenticazione, dalle più comuni come local (username e password) alle più complesse come OAuth.

Configurare Passport.js in un’Applicazione Express.js

Installazione di Passport.js

Per iniziare, installa passport e la strategia passport-local utilizzando npm:

npm install passport passport-local express-session

Configurare Express.js per Usare Passport.js

Per utilizzare Passport.js in un’applicazione Express.js, è necessario configurare il middleware di sessione e inizializzare Passport. Ecco come fare:

const express = require("express");
const passport = require("passport");
const LocalStrategy = require("passport-local").Strategy;
const session = require("express-session");

const app = express();

// Configurazione della sessione
app.use(
  session({
    secret: "il-mio-segreto", // Dovresti utilizzare una stringa più complessa
    resave: false,
    saveUninitialized: false,
  })
);

// Inizializza Passport e la sessione Passport
app.use(passport.initialize());
app.use(passport.session());

Configurare la Strategia Local

Passport.js supporta diverse strategie di autenticazione. La strategia local autentica gli utenti tramite username e password. Ecco come configurarla:

passport.use(
  new LocalStrategy(function (username, password, done) {
    // Simula una ricerca utente nel database
    const user = { id: 1, username: "test", password: "password123" }; // Questo è solo un esempio

    if (username !== user.username) {
      return done(null, false, { message: "Username non corretto" });
    }
    if (password !== user.password) {
      return done(null, false, { message: "Password non corretta" });
    }

    return done(null, user);
  })
);

// Serializzazione dell'utente nella sessione
passport.serializeUser(function (user, done) {
  done(null, user.id);
});

// Deserializzazione dell'utente dalla sessione
passport.deserializeUser(function (id, done) {
  // Simula una ricerca utente nel database
  const user = { id: 1, username: "test" }; // Questo è solo un esempio
  done(null, user);
});

Implementare le Rotte di Login

Ora che Passport.js è configurato, è possibile creare le rotte per gestire il login degli utenti.

Rotta di Login

Ecco un esempio di una rotta POST per gestire il login:

app.post(
  "/login",
  passport.authenticate("local", {
    successRedirect: "/dashboard",
    failureRedirect: "/login",
    failureFlash: true,
  })
);

In questo esempio, se l’autenticazione ha successo, l’utente viene reindirizzato alla dashboard, altrimenti viene riportato alla pagina di login.

Rotta per il Logout

Per gestire il logout dell’utente:

app.get("/logout", (req, res) => {
  req.logout((err) => {
    if (err) {
      return next(err);
    }
    res.redirect("/");
  });
});

Questa rotta chiama req.logout per terminare la sessione dell’utente e reindirizza alla homepage.

Proteggere le Rotte

Per proteggere le rotte e assicurarsi che solo gli utenti autenticati possano accedervi, puoi usare un middleware personalizzato:

function ensureAuthenticated(req, res, next) {
  if (req.isAuthenticated()) {
    return next();
  }
  res.redirect("/login");
}

app.get("/dashboard", ensureAuthenticated, (req, res) => {
  res.send("Benvenuto nella dashboard!");
});

Questo middleware verifica se l’utente è autenticato prima di consentirgli di accedere alla dashboard.

Integrazione con Altre Strategie di Autenticazione

Passport.js supporta molte altre strategie di autenticazione oltre a passport-local. Ad esempio, per integrare l’autenticazione OAuth con Google:

Installazione della Strategia Google

npm install passport-google-oauth20

Configurazione della Strategia Google

const GoogleStrategy = require("passport-google-oauth20").Strategy;

passport.use(
  new GoogleStrategy(
    {
      clientID: "GOOGLE_CLIENT_ID",
      clientSecret: "GOOGLE_CLIENT_SECRET",
      callbackURL: "http://localhost:3000/auth/google/callback",
    },
    function (accessToken, refreshToken, profile, done) {
      // Logica per trovare o creare l'utente nel database
      return done(null, profile);
    }
  )
);

// Rotte per l'autenticazione con Google
app.get(
  "/auth/google",
  passport.authenticate("google", { scope: ["profile", "email"] })
);

app.get(
  "/auth/google/callback",
  passport.authenticate("google", { failureRedirect: "/login" }),
  (req, res) => {
    res.redirect("/dashboard");
  }
);

In questo esempio, l’utente può autenticarsi tramite Google e viene reindirizzato alla dashboard dopo un login riuscito.

Best Practices per l’Autenticazione

  • Protezione delle Credenziali: Usa HTTPS e memorizza le password in modo sicuro, utilizzando funzioni di hashing come bcrypt.
  • Gestione delle Sessioni: Configura le sessioni in modo sicuro, impostando scadenze e utilizzando token di sessione sicuri.
  • Protezione delle Rotte: Assicurati di proteggere le rotte sensibili utilizzando middleware che verifichi l’autenticazione dell’utente.

Risolvere Problemi Comuni

Errore di Autenticazione

Se riscontri problemi con l’autenticazione, verifica che la strategia sia configurata correttamente e che i dati dell’utente siano corretti. Controlla anche i messaggi di errore e log per diagnosticare eventuali problemi.

Persistenza delle Sessioni

Se le sessioni non vengono mantenute tra le richieste, verifica la configurazione di express-session e assicurati che Passport sia inizializzato correttamente.

Conclusione

Passport.js è uno strumento potente e flessibile per gestire l’autenticazione in applicazioni Express.js. Con il supporto per una vasta gamma di strategie, è possibile implementare facilmente un sistema di autenticazione che soddisfi le esigenze della tua applicazione. Configurando correttamente le strategie e proteggendo le rotte sensibili, puoi creare un’esperienza utente sicura e fluida.