‫Narratore: Finora nella nostra implementazione dell'autenticazione
‫abbiamo effettuato l'accesso degli utenti con una password corretta.
‫Quindi, in pratica, abbiamo completato questo primo passaggio del
‫flusso di lavoro di
‫autenticazione in cui viene creato un
‫token Web JSON e inviato al client se
‫l'utente fornisce un'e-mail e una password corrette.
‫Quindi in seguito implementeremo effettivamente percorsi protetti.
‫Quindi, in pratica, utilizzando il token Web
‫JSON creato per consentire agli utenti registrati l'accesso a percorsi protetti.
‫E questo è il secondo passaggio dell'autenticazione.
‫E quindi ora andiamo avanti e implementiamo questa funzionalità.
‫Quindi diciamo che volevamo proteggere
‫il percorso getAllTours.
‫Quindi, in pratica, consenti solo agli utenti registrati
‫di accedere a un elenco di tutti i nostri tour.
‫E cosa significa che prima di eseguire il
‫gestore di ottenere tutti i tour,
‫diamo un'occhiata a questo.
‫Ok, quindi prima di eseguire questo handle
‫qui, dovremmo effettuare un controllo
‫per verificare se
‫l'utente è effettivamente connesso o meno, giusto?
‫E quindi il modo
‫migliore per farlo, come probabilmente già
‫saprai a questo punto, è usare una funzione middleware, ok?
‫Quindi in questo video, per
‫proteggere le rotte, creeremo una funzione
‫middleware che verrà eseguita prima di ciascuno di questi gestori, ok.
‫Quindi una funzione che starà proprio qui,
‫quindi prima che questa funzione qui possa essere eseguita.
‫E questo middleware restituirà un errore se
‫l'utente non è autenticato, quindi
‫se non ha
‫effettuato l'accesso, o chiamerà il
‫prossimo middleware che è in questo caso il gestore getAllTours, giusto?
‫E questo protegge efficacemente questo percorso
‫da accessi non autorizzati.
‫Quindi andiamo avanti e creiamo rapidamente
‫quella funzione middleware e
‫poi la mettiamo
‫qui per illustrare ciò che ho appena detto.
‫Ok, quindi anche qui nel nostro controller di
‫autenticazione creeremo una nuova funzione middleware
‫e si chiamerà protect.
‫Va bene,
‫e proprio come prima userò catchAsync
‫perché ancora una volta tutte queste
‫funzioni sono effettivamente funzioni asincrone.
‫Va bene, e poi qui ovviamente, la nostra funzione
‫middleware e per ora chiamiamo semplicemente next qui
‫solo in modo che abbiamo effettivamente qualsiasi corpo
‫qui in questa funzione
‫middleware e poi torniamo ai nostri percorsi
‫di tour e quindi proteggiamo questo percorso, ok ?
‫Quindi, prima di tutto, devo effettivamente richiedere questo
‫modulo del controller di autenticazione.
‫Quindi
‫const e poi require
‫it's in controllers,
‫e poi authController, okay.
‫Quindi ora colleghiamolo,
‫proprio qui nel percorso getAllTours.
‫Va bene.
‫Quindi authController. proteggere.
‫Va bene.
‫E quindi in questo momento questa funzione middleware verrà eseguita
‫prima e poi ancora, se l'utente non è autenticato, si
‫verificherà un errore.
‫E ovviamente poi il middleware successivo,
‫quindi quello che
‫effettivamente riceve e invia tutti i tour non verrà eseguito.
‫Va bene.
‫E così ancora, questo proteggerà efficacemente l'accesso a
‫questa risorsa qui da utenti che non hanno effettuato l'accesso.
‫Va bene, allora torniamo qui.
‫Non l'utente instrada,
‫ma il controller di autenticazione.
‫Bene, ora parliamo dell'implementazione di questo middleware
‫di protezione.
‫Cosa dovremo fare esattamente?
‫Bene, iniziamo mettendo in fila un paio di passaggi qui.
‫Va bene, e in realtà prima di tutto dobbiamo
‫contrassegnare questa funzione come Async, altrimenti non avremmo davvero
‫bisogno di catchAsync, giusto?
‫E vedrai perché abbiamo bisogno che questa sia una funzione
‫asincrona in un secondo, ok?
‫Ma ora vediamo effettivamente i passaggi
‫che dobbiamo compiere per implementare questo middleware di protezione.
‫Quindi, proprio come
‫prima, metterò questi passaggi qui come commenti.
‫Prima di tutto dobbiamo ottenere effettivamente il token.
‫E
‫controlla se c'è fondamentalmente,
‫quindi controlla se esiste.
‫Quindi, dobbiamo convalidare il token.
‫E quindi questo è fondamentalmente quel passaggio super
‫importante di cui abbiamo parlato prima in cui l'algoritmo JWT verifica se la firma
‫è valida o se non
‫lo è.
‫E quindi quindi se il token è valido o meno, ok?
‫E quindi in realtà chiamiamo questo qui verifica.
‫Penso che sia così che l'abbiamo chiamato in quella diapositiva in
‫cui ne abbiamo parlato prima, va bene.
‫E se non ricordi davvero come
‫funzionava, beh, puoi
‫sempre tornare indietro e rivedere quella lezione, ok?
‫Quindi il prossimo passo, quindi se la verifica ha avuto successo,
‫dobbiamo anche controllare se l'utente che sta tentando
‫di accedere al percorso esiste ancora, ok?
‫Quindi controlla se l'utente esiste ancora e parlerò di più
‫del motivo per cui ciascuno
‫di questi passaggi è necessario una volta che inizieremo a implementarli, ok?
‫Quindi per ora questo potrebbe non avere molto senso
‫per te, ma di nuovo parlerò di ogni fermata una volta arrivati lì.
‫Va bene?
‫E infine dobbiamo anche
‫verificare
‫se l'utente ha
‫cambiato la password
‫dopo l'emissione del JWT, ok?
‫Bene, diciamo solo
‫token qui, l'abbiamo chiamato token ovunque, ok?
‫E quindi solo se non ci
‫sono stati problemi in nessuno
‫di questi passaggi qui, ovviamente, verrà chiamato il prossimo che
‫avrà quindi accesso al percorso che abbiamo protetto.
‫Quindi nel nostro esempio attuale, di nuovo, questo gestore getAllTours.
‫Destra?
‫Ok, ma torniamo indietro
‫e iniziamo a implementare il nostro primo passo qui.
‫Quindi, in pratica, ottenere il
‫token e quindi verificare se esiste effettivamente.
‫Quindi una pratica comune è inviare un token utilizzando un'intestazione http
‫con la richiesta, ok?
‫Quindi diamo un'occhiata a come possiamo impostare le intestazioni in
‫Postman per inviarlo insieme alla
‫richiesta e poi anche come possiamo ottenere
‫l'accesso a queste intestazioni in Express.
‫E facciamo prima quello.
‫Quindi qui in apt. js Penso che qui abbiamo
‫questo bel middleware, quindi qui accediamo effettivamente alla
‫richiesta della console. headers, ok, abbiamo
‫parlato prima degli header http, ed
‫è così che possiamo accedervi in Express.
‫Ok, quindi fondamentalmente alle intestazioni della richiesta, quindi
‫quelle che un cliente può inviare insieme alla sua richiesta.
‫Ok, e quindi qui a Postman, andiamo ora
‫al percorso che stiamo cercando di proteggere.
‫E poi qui imposta un'intestazione.
‫E facciamone uno
‫di prova e lo impostiamo su Jonas, ok?
‫Ora manderò solo
‫questo e qui in Express, diamo un'occhiata a questo.
‫E così infatti qui otteniamo un oggetto con tutte le intestazioni
‫che fanno parte della richiesta.
‫Quindi tutto questo qui.
‫E vedi che ci sono un sacco
‫di intestazioni che Postman invia effettivamente automaticamente insieme
‫alla richiesta, ad esempio, dice che lo user-agent è Postman,
‫invia anche l'host, e alcune altre
‫di cui parleremo più avanti come
‫accettare per es.
‫Ora ciò che conta qui è in realtà l'intestazione
‫che ci siamo prefissati.
‫Ok, quindi l'intestazione del test è impostata su jonas che abbiamo
‫appena inviato nella nostra richiesta.
‫Ora per inviare un token Web JSON come intestazione, in realtà
‫esiste uno standard per farlo.
‫Quindi torniamo qui, liberiamoci di tutto questo.
‫E quindi lo standard per l'invio di un token è
‫che dovremmo sempre usare un'intestazione chiamata autorizzazione.
‫Va bene?
‫Quindi proprio così e
‫poi il valore di quell'intestazione dovrebbe sempre iniziare
‫con Bearer, ok?
‫Perché in fondo noi portiamo, abbiamo, possediamo questo token e poi
‫ecco il valore del token.
‫Quindi proprio come questa stringa casuale che abbiamo ottenuto prima.
‫Quindi lasciamo che sia lei a questo come esempio, e
‫quindi mandiamolo adesso.
‫E poi, in effetti, dovremmo averlo qui.
‫Va bene.
‫Ora Express trasforma automaticamente tutti i nomi delle intestazioni
‫in minuscolo, come puoi vedere qui,
‫ma ovviamente il valore dell'intestazione qui è sempre lo stesso.
‫Ok, quindi fondamentalmente questa parte del valore dell'intestazione è
‫il nostro token.
‫Ed è così che
‫ora dovremmo leggere quel token dall'intestazione.
‫Va bene?
‫Quindi, se
‫in
‫realtà c'è req. intestazioni. autorizzazione, ok, e
‫se inizia
‫fondamentalmente con questa stringa portante qui va bene, quindi
‫req. intestazioni. autorizzazione e ora
‫questa è una stringa e
‫quindi possiamo usare startWith su questo
‫va bene, quindi questo è di nuovo solo normale JavaScript
‫va bene.
‫E quindi queste sono le condizioni in base alle quali vogliamo
‫effettivamente salvare un token, ok?
‫Quindi, di nuovo, nel caso in
‫cui l'intestazione esista e il suo valore inizi con Bearer, ok.
‫Allora in tal caso vogliamo dire che il token è uguale
‫a req. intestazioni. autorizzazione e
‫ora come otteniamo effettivamente questa seconda
‫parte della stringa?
‫Bene, fondamentalmente divideremo la stringa con questo
‫carattere spazio, ok, il che creerà
‫quindi un array con
‫questo Bearer
‫e con questo token e
‫quindi prenderemo quella parte
‫dell'array che vogliamo.
‫Quindi dividi usando lo spazio,
‫e poi da quell'array vogliamo il secondo elemento.
‫Va bene?
‫Ora non possiamo effettivamente definire una variabile all'interno di un
‫blocco if
‫perché const e let, quindi
‫il nuovo dichiarativo di variabili ES6 è in realtà
‫nell'ambito del blocco, e quindi
‫qualunque cosa definiamo in questo blocco qui non sarà
‫disponibile al di fuori di esso.
‫Ok, quindi facciamolo davvero fuori.
‫E quindi riassegna semplicemente questo valore al token.
‫Va bene.
‫E ora, registriamo il token sulla console solo
‫per vedere se funziona.
‫Ok, e in effetti otteniamo una specie di
‫vero token qui.
‫Quindi quello con cui abbiamo appena effettuato l'accesso.
‫E poi metti quello qui, va bene.
‫Quindi
‫invialo, e ah!
‫Eccoci qui.
‫Quindi qui abbiamo i dati del token Web JSON che abbiamo appena inviato
‫insieme alla richiesta.
‫Spegniamo rapidamente questo registro della console qui.
‫Va bene, e poco prima di andare avanti, controlliamo
‫effettivamente se il token esiste effettivamente.
‫Va bene.
‫Quindi, se non c'è
‫un token well, ovviamente vogliamo creare un nuovo errore.
‫Giusto, e proprio come prima,
‫torniamo da questo middleware e
‫chiamiamo il prossimo, ok.
‫E ora qui, creeremo un errore e quindi passeremo
‫direttamente al nostro
‫middleware di gestione degli errori globale con questo errore.
‫Va bene, quindi se non è stato inviato alcun token con la
‫richiesta, significa che non abbiamo effettuato l'accesso.
‫Quindi inviamo all'utente che non sei
‫loggato.
‫Effettua il login per ottenere l'accesso.
‫Va bene, e ora il
‫codice di stato per questo tipo di
‫situazione è 401 che significa non autorizzato, ok?
‫Non sono sicuro di averlo usato
‫prima e sì, in realtà l'abbiamo fatto anche qui.
‫Ok, quindi questo significa
‫sostanzialmente che i dati che sono stati inviati nella richiesta
‫sono corretti, ma non sono sufficienti sostanzialmente per ottenere
‫l'accesso dell'utente a una risorsa che sta richiedendo.
‫Va bene.
‫Salvalo qui
‫e provalo di nuovo.
‫Quindi, se fondamentalmente togliamo questa intestazione qui,
‫allora dovremmo andare subito in quell'errore,
‫giusto?
‫E infatti, non sei loggato, per favore accedi
‫per ottenere l'accesso.
‫Con 401 non autorizzato.
‫Grande! Quindi quella parte sta già funzionando.
‫Va bene, e ora solo per ricapitolare, quindi
‫in questo momento non stiamo inviando alcun token insieme
‫alla richiesta, giusto?
‫E quindi per questo motivo, ovviamente, non c'è nessun token, ok?
‫E quindi creiamo questo errore,
‫che attiverà quindi il nostro middleware del gestore degli
‫errori per inviare quell'errore al client, ok?
‫E poi ovviamente non abbiamo accesso a tutti
‫i tour, perché ovviamente questo
‫middleware viene eseguito prima del controller getAllTours.
‫E quindi in questo momento, questo è davvero protetto, ok?
‫Quindi funziona già abbastanza bene a questo punto.
‫Ma ovviamente, questo è tutt'altro che sufficiente,
‫perché non è sufficiente inviare semplicemente un token con una richiesta.
‫Deve anche essere un token valido.
‫Quindi fondamentalmente un token in cui nessuno
‫ha provato a cambiare il payload.
‫Ok, e il payload, ricorda, nel nostro caso è
‫sempre lo user_id dell'utente per il quale è stato emesso il token.
‫Va bene, quindi
‫dobbiamo implementare questo passaggio di verifica.
‫Ma questa lezione è già abbastanza lunga e ci
‫sono ancora molte cose da fare
‫qui, quindi lasciamo stare questo per il prossimo video.