Autenticazione in Express.js con Passport.js
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.