Quindi ho scritto una domanda fittizia, un modulo di login scritto in angular2, che registra il nome utente e la password su un'API di resto, se le credenziali sono corrette, l'API restituisce un JWT (codificate nel JWT sono varie autorizzazioni). Il JWT viene salvato nella memoria del browser locale.
Funziona perfettamente, il JWT è memorizzato nell'archivio locale (secondo le guide che ho letto online) e può essere accessibile a chiunque abbia un po 'di conoscenza del browser (controlla elemento, visualizza risorse ecc.) e una volta che accedi al Token JWT, può essere facilmente decifrato senza l'uso di una chiave.
Nella mia applicazione angular2, decodifica la chiave, se la chiave contiene "value1 = True" consente all'utente di accedere a una determinata parte del sito Web, se il valore della chiave è falso, restituisce l'utente alla home page con un messaggio di accesso negato. Di nuovo funziona bene nella mia configurazione di prova.
Poiché la chiave viene memorizzata solo localmente, posso creare una JWT ovunque, incollarla nella memoria locale del mio browser con le credenziali corrette, quindi posso accedere alle aree riservate del sito web.
Ho perso qualcosa, in quanto questo non sembra sicuro? Diciamo che la mia app era online su mynewapp.com e che l'area mynewapp.com/private era protetta con questa autenticazione JWT, l'applicazione ha verificato un JWT valido, se viene trovato un token JWT valido, ispeziona il token, per vedere se contiene le autorizzazioni rilevanti per accedere a quest'area, in caso contrario, cosa è impedire alla persona dietro il browser di modificare il contenuto della memoria locale del browser, di manipolare i dati per accedere a quest'area proibita.
L'unico modo in cui posso pensare è:
Se JWT esiste, esegui una chiamata API al server REST, se l'utente con il JWT dispone dell'autorizzazione per accedere all'area richiesta, restituisce true e consente alla richiesta di continuare all'interno di Angular
Altrimenti, REST Api restituisce false e l'utente non è più autorizzato.