‫Istruttore: Così abbiamo appreso nell'ultima
‫lezione che il token Web JSON deve
‫essere archiviato in un cookie sicuro solo HTTP.
‫Ma in questo momento, stiamo solo inviando
‫il token come una semplice stringa nella nostra risposta JSON.
‫Quindi, in questo video, inviamo anche il token come cookie, in modo
‫che il browser possa salvarlo in questo
‫modo più sicuro.
‫Quindi siamo nel nostro codice.
‫Inviamo effettivamente il token al client?
‫Bene, ricorda, questo è in authController e
‫proprio qui nella funzione createSendToken.
‫Quindi, prima, avevamo praticamente tutto questo
‫codice in molti posti diversi, ma poi abbiamo refactoring
‫tutto questo solo in questa funzione createSendToken.
‫Va bene, quindi è qui che lavoreremo ora.
‫Ora, sono sicuro che hai
‫familiarità con il modo in cui funzionano i
‫cookie in generale, ma solo per assicurarci che siamo tutti sulla
‫stessa pagina qui, parliamo un po' dei cookie.
‫Quindi, prima di tutto, un cookie è fondamentalmente solo
‫un piccolo pezzo di testo che un server può inviare ai client.
‫Quindi, quando il client riceve un cookie,
‫lo memorizzerà automaticamente
‫e quindi lo reinvierà automaticamente
‫insieme a tutte le richieste future allo stesso server.
‫Va bene, ancora una volta, un browser memorizza automaticamente un
‫cookie che riceve e lo rimanda
‫in tutte le richieste future a quel server da cui proviene.
‫Ok, per ora, questo non sarà
‫molto importante per
‫noi, perché stiamo solo testando l'API usando Postman.
‫Ma un po' più tardi, quando renderemo le
‫pagine Web dinamiche e interagiremo realmente
‫con il browser, diventerà
‫davvero importante che il browser restituisca il
‫token praticamente automaticamente in ogni richiesta.
‫Ok, e per allora, ovviamente, ne parleremo di più.
‫Ma comunque, impariamo ora come creare e
‫inviare effettivamente un cookie.
‫Quindi, per inviare un cookie, è in realtà molto semplice.
‫Tutto ciò che dobbiamo fare è fondamentalmente
‫collegarlo all'oggetto risposta.
‫Quindi diciamo ris. cookie e poi tutto
‫ciò che dobbiamo fare è specificare il
‫nome del cookie, e lo chiamo
‫token web JSON, quindi i dati che vogliamo effettivamente
‫inviare nel cookie, e quindi questa sarà ovviamente la
‫variabile token e poi, dopo, un paio di opzioni per il cookie.
‫E la prima opzione
‫che specificheremo è la proprietà scade.
‫Ok, quindi in pratica, questa proprietà di
‫scadenza farà sì che il browser o il client in
‫generale eliminino il cookie dopo che è scaduto.
‫Ok, quindi impostiamo la data di
‫scadenza simile a quella che abbiamo impostato nel token web JSON, ok.
‫Quindi creiamo effettivamente una nuova variabile
‫per questo, ok, perché il pacchetto token Web
‫JSON può quindi funzionare con questo formato.
‫Ok, ma in JavaScript, questo è un po' privo di significato
‫e quindi, invece, creiamo una variabile con un numero reale.
‫Quindi chiamiamolo ancora JWT, quindi
‫cookie,
‫scade e lo impostiamo ancora su 90, quindi 90 giorni, ma
‫ancora una volta, senza D.
‫Ok, così ora possiamo effettivamente
‫operare con esso perché dovremo convertirlo in millisecondi, ok.
‫Quindi, quando dovrebbe scadere questo cookie?
‫Dovrebbe scadere a una nuova data.
‫Quindi in JavaScript, quando si specificano
‫le date, dobbiamo sempre dire
‫nuova data e quindi dovrebbe scadere in questo momento, più questi 90 giorni.
‫Ok, quindi ora, in questo modo ovviamente.
‫E poi processa. env, e
‫ora usiamo questo e poi mettiamo semplicemente
‫il biscotto lì dentro, ok.
‫Ma ora, ovviamente, dobbiamo convertirlo in millisecondi.
‫Quindi abbiamo 90 giorni adesso.
‫Quindi due ore, sono le 24.
‫Due minuti, sono 60.
‫Due secondi, sono di nuovo 60 volte.
‫E poi in millisecondi, mille volte, ok.
‫E, naturalmente, potrei fare tutto in
‫una volta, ma questo è solo per specificare cosa stiamo facendo esattamente.
‫Quindi, per mostrare
‫che lo stiamo effettivamente convertendo in millisecondi.
‫La prossima opzione sarà l'opzione sicura.
‫Quindi imposteremo questo su true e
‫così in questo modo, il cookie verrà inviato solo
‫su una connessione crittografata.
‫Quindi, in pratica, stiamo usando solo HTTPS, va bene.
‫E infine, è l'opzione httpOnly di cui abbiamo
‫parlato prima.
‫Ok, quindi impostiamo questo su true
‫e così questo farà in
‫modo che il cookie non sia accessibile o modificato in alcun modo dal browser.
‫Ok, quindi questo è importante per prevenire
‫quegli attacchi di scripting tra siti.
‫Va bene, quindi tutto ciò che
‫il browser farà quando impostiamo httpOnly su true
‫è fondamentalmente ricevere il
‫cookie, memorizzarlo e quindi inviarlo automaticamente insieme a ogni richiesta.
‫Ok, e in effetti è così.
‫Quindi è così che sostanzialmente definiamo il cookie, quindi diciamo
‫questa parte, e poi lo
‫inviamo usando res. biscotto.
‫Ora, se volessimo testarlo in questo momento, non funzionerebbe perché
‫in questo momento in realtà non stiamo usando HTTPS.
‫E quindi per via di questo secure: true,
‫il cookie non verrebbe
‫creato e non verrebbe inviato al client.
‫Va bene, quindi
‫in pratica, vogliamo solo attivare questa parte qui in produzione.
‫Quindi quello che farò è fondamentalmente
‫esportare questo intero oggetto qui in una variabile separata.
‫Ok, allora lascia che te lo mostri.
‫Quindi
‫const cookieOptions dovrebbe essere uguale
‫a this e poi qui, lo passiamo.
‫Va bene.
‫Ora, ovviamente, non vogliamo questa parte qui,
‫ma solo quando siamo in produzione.
‫Quindi
‫diciamo se process. avv. NODE_ENV, ricorda che è dove
‫è memorizzato se siamo in
‫produzione o meno.
‫Quindi, se è
‫uguale alla produzione, imposta cookieOptions. sicuro uguale a
‫vero.
‫Ok, e ora possiamo rimuoverlo da qui.
‫Sì, quindi ora, solo quando saremo in
‫produzione, avremo le opzioni sicure impostate su true.
‫E in caso contrario, verrà inviato solo in
‫questo modo, quindi solo con la data di scadenza e httpOnly.
‫Ok, quindi ora proviamo questo.
‫E lo proverò creando un nuovo utente.
‫Quindi qui in Iscriviti in
‫realtà e chiamiamo
‫questo utente@jonas. io.
‫Sempre con la stessa password.
‫Lo chiamerò anche Utente
‫e diciamo che il ruolo qui è una guida, così
‫solo per avere anche alcuni ruoli diversi qui.
‫Dagli un po' più di spazio.
‫E ora, proviamoci davvero.
‫E la risposta è proprio come ci aspettavamo
‫con la differenza
‫che ora otteniamo un cookie qui in questa scheda Cookie.
‫E così infatti, qui,
‫otteniamo il nome del cookie, il valore.
‫Abbiamo anche la data
‫di scadenza, che è esattamente 90 giorni da adesso.
‫Abbiamo httpOnly impostato su true e anche secure impostato su false.
‫Va bene.
‫Ottimo, possiamo anche vedere tutti i cookie che abbiamo
‫qui in questa scheda Cookie.
‫E così di nuovo, vediamo quel cookie che abbiamo
‫ricevuto da questo dominio, va bene.
‫Ora, solo un'ultima cosa che in realtà
‫voglio cambiare in quella funzione su
‫cui stiamo
‫lavorando, quindi createSendToken, è sostanzialmente sbarazzarsi di questa password qui nell'output.
‫Ok, quindi nel nostro schema, lo abbiamo effettivamente impostato per
‫selezionare false, in modo che non venga visualizzato quando effettuiamo
‫query per tutti gli utenti.
‫Ma in questo caso, deriva dalla creazione di un nuovo documento
‫e quindi è diverso ed è per questo che lo vediamo qui.
‫Ok, ma in realtà possiamo risolverlo molto facilmente.
‫Ok, quindi tutto ciò che dobbiamo fare in realtà è
‫impostare l'utente. password
‫a non definita.
‫Va bene, quindi
‫dovrebbe
‫rimuovere le password dall'output.
‫Va bene.
‫Quindi cancelliamo questo utente qui che abbiamo appena creato.
‫E riprova solo
‫per vedere se la password non viene più visualizzata.
‫E sì, in effetti ora non c'è più.
‫E ancora, il nostro biscotto, ovviamente, è qui.
‫E quando ora arriviamo alla nostra scheda Cookie,
‫beh, allora hai ancora solo un cookie
‫perché quello vecchio è stato praticamente sovrascritto da questo
‫nuovo e questo
‫perché hanno lo stesso nome.
‫Quindi il nome è come l'identificatore univoco di un cookie.
‫E quindi se ne riceviamo uno con
‫il nome che è
‫già stato dato, beh, allora il vecchio viene semplicemente sostituito.
‫Ok, e in effetti è così.
‫Quindi è così che inviamo un cookie solo HTTP e,
‫di nuovo, ne parleremo di più
‫quando costruiremo il nostro sito Web dinamico.