Creare un sistema di Autenticazione con JWT usando Node.js

JSON Web Token (JWT) è uno standard che definisce un sistema per trasmettere in modo sicuro le informazioni tra le parti come un oggetto JSON.

Pubblicato da ,
Ultima modifica

In questo articolo vedremo come creare un sistema di autenticazione con JWT usando Node.js, in particolare verrà usato il Framework Express per applicazioni Node.js, jsonwebtoken per generare il token e body-parser per ottenere il corpo della richiesta.

Se non abbiamo ancora installato Node.js sul nostro pc, è possibile scaricare l'ultima versione al seguente link:

Download | Node.js

Tramite CLI posizioniamoci all'interno della cartella del progetto e lanciamo il comando npm init

> cd <percorso cartella>
> npm init

verrà così generato un file package.json simile a questo

{
  "name": "node_jwt",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

dove name è il nome del progetto, che in questo caso ho scelto node_jwt, e altre informazioni sulla versione del progetto stesso, in questo caso è '1.0.0'.

Il passo successivo è installare expressjsonwebtoken e body-parser, questa operazione si esegue sempre tramite CLI con il seguente comando

npm install --save express jsonwebtoken body-parser

e poi invio.

Al termine di questo processo di installazione verrà creata una cartella node_modules nella root del progetto.

Creiamo adesso un file index.js

index.js

const express = require('express');
const jwt = require('jsonwebtoken');
const bodyParser = require('body-parser');
const app = express();

app.use(bodyParser.urlencoded({ extended: true }));

app.get('/api',(req,res)=>{

    res.json({
        "message":"Ehi, ciao! Benvenuto in questo servizio API"
    });

});


app.listen(3000,(req,res)=>{
    console.log('Avvio del server sulla porta 3000');
});

in particolare creiamo una richiesta (/api) tramite il metodo get e un server di test locale usando l'indirizzo http://localhost:3000 tramite il metodo listen, per avviare il server usare il seguente comando

node index.js

se il server è avviato correttamente vedremo nel terminale il messaggio "Avvio del server sulla porta 3000".

Per testare le richieste uso Postman un software molto usato per la creazione di API, se testiamo il link /api otterremo il seguente risultato

 

Postman GET Request

 

quindi abbiamo creato una richiesta in GET usando l'indirizzo localhost:3000/api.

Fin qui abbiamo visto come creare una richiesta in GET, adesso vediamo come creare un sistema che ci permetta di generare un token e usarlo come intestazione nelle richieste successive.

index.js

//......
//......

app.post('/api/profile',(req,res)=>{
    res.json({
        "message":"Il mio Profilo"
    });
});


// esempio richiesta
// { id: '1', username: 'michele', email: 'michele@mail.com' }

app.post('/api/login',(req,res)=>{
    console.log('Body Request:', req.body);
    const user = {
        id: req.body.id,
        username: req.body.username,
        email: req.body.email
    }

    jwt.sign({user:user},'secretkey',(err,token)=>{
        res.json({
            token,
        });
    });
});

sono state create due richieste in modalità POST api/profile e api/login, quest'ultima richiesta restituisce un token generato usando informazioni riguardo l'utente (id, username, email) e una chiave segreta (secretkey), il token così generato varrà usato successivamente come intestazione di /api/profile

Questo è il risultato ottenuto, tramite Postman, della richiesta /api/login specificando nel Body id, username e email dell'utente

 

Postman POST Request

 

un oggetto json contenente un token.

Adesso faremo in modo che la richiesta /api/profile richieda il token adesso generato nell'intestazione, per fare ciò modifichiamo questa richiesta

index.js

//.....

app.post('/api/profile',verifyToken,(req,res)=>{
    jwt.verify(req.token,'secretkey',(err, authData)=>{
       
        if(err){
            res.sendStatus(403); //Forbidden
        }else{
        res.json({
            'message':'Il mio Profilo',
            authData
        }); 
        }


    });


});

//.....

function verifyToken(req,res,next){
    const bearerHeader = req.headers['authorization'];
    if(typeof bearerHeader!=='undefined'){
        const bearerToken = bearerHeader.split(' ')[1]
        req.token=bearerToken
        next()
    }else{

        res.sendStatus(403);
    }

}

la funzione verifyToken ( è un middleware ) verificherà se il token nell'intestazione è valido oppure no.

Adesso se facciamo un test tramite Postman lanciando la richiesta /api/profile senza il token nell'intestazione avremo il seguente risultato

 

JWT con node.js

 

cioè un errore di tipo 403 (Forbidden), se invece facciamo la stessa richiesta ma aggiungiamo nell'intestazione il token generato avremo il seguente risultato

 

JWT con node.js