La sicurezza è una parte importante di ogni app Web e gli sviluppatori devono assicurarsi di progettare app con autenticazione sicura. In questo tutorial, imparerai come implementare l'autenticazione basata su JWT in app Angolari con l'aiuto di un semplice server Express.
Il codice completo può essere trovato nel nostro repository GitHub. L'app che costruiremo sarà simile a questa:
Un JSON Web Token (JWT) è fondamentalmente un oggetto rappresentato da tre stringhe che vengono utilizzate per trasmettere le informazioni dell'utente. Le tre stringhe, separate da punti, sono:
Quando un utente accede a qualsiasi pagina Web con il proprio nome utente e password, il server di autenticazione di solito crea e invia un JWT. Questo JWT viene quindi passato insieme alle successive chiamate API al server. Il JWT rimane valido fino a quando non scade o l'utente si disconnette dall'applicazione.
Questo processo può essere illustrato nello schema seguente.
Useremo la memoria locale per archiviare i token. L'archiviazione locale è un mezzo tramite il quale i dati vengono archiviati localmente e possono essere rimossi solo tramite JavaScript o cancellando la cache nel browser. I dati memorizzati nella memoria locale possono persistere per un tempo molto lungo. I cookie, d'altra parte, sono messaggi che vengono inviati dal server al browser e offrono solo spazio di archiviazione limitato.
Inizieremo creando un server back-end che includa i seguenti endpoint:
Iniziamo creando una directory per l'applicazione Express e quindi eseguendo il comando npm init
per impostare i file richiesti per il progetto.
mkdir server cd server npm init
Quindi, crea un file server.js e installare i moduli: esprimere
, jsonwebtoken
, cors
, e bodyParser
.
touch server.js npm installa express jsonwebtoken cors bodyParser -save
Ora aperto server.js e inizia importando i moduli.
// server.js const cors = require ('cors'); const bodyParser = require ('body-parser'); const jwt = require ('jsonwebtoken'); const express = require ('express');
Quindi crea un'app Express e definisci la chiave segreta che verrà utilizzata per codificare e decodificare i dettagli dell'utente.
// CREATE EXPRESS APP const app = express (); app.use (CORS ()); app.use (bodyParser.json ()); // DECLARE JWT-secret const JWT_Secret = 'your_secret_key';
Non utilizzeremo un database per questo esempio. Tuttavia, i concetti sarebbero simili se si stesse costruendo un server supportato da database appropriato.
Per il nostro esempio, utilizzeremo semplicemente una variabile per definire un utente di prova come mostrato di seguito.
var testUser = email: '[email protected]', password: '1234';
Il passo finale è creare percorsi per autenticare l'utente.
app.post ('/ api / authenticate', (req, res) => if (req.body) var user = req.body; console.log (utente) if (testUser.email === req.body .email && testUser.password === req.body.password) var token = jwt.sign (utente, JWT_Secret); res.status (200) .send (signed_user: user, token: token); else res.status (403) .send (errorMessage: 'Autorizzazione richiesta!'); else res.status (403) .send (errorMessage: 'Fornire e-mail e password');) ;
Analizziamo il codice per la rotta sopra.
Per prima cosa controlliamo se ci sono dati nel corpo della richiesta. Se non vengono trovati dati, chiediamo all'utente di inserire alcuni dati. Nell'occasione che l'utente ha fornito i dati corretti, li confrontiamo con i dati del UtenteDiProva
e, se corrisponde, usiamo l'id utente per generare un token univoco e rimandare la risposta all'utente.
Infine, creiamo un endpoint per l'esecuzione dell'app.
app.listen (5000, () => console.log ('Server avviato su porta 5000'));
Il nostro back-end è ora completo e puoi testarlo con Postmano CURL e vedere il tipo di dati che verranno restituiti all'utente.
La nostra applicazione Angular presenterà le seguenti pagine:
Creare un'applicazione angolare e creare il Accesso
e Profilo
componenti come mostrato di seguito:
nuovo componente angular6jwt cd angular6jwt ng g Login ng g componente Profile
Successivamente, aggiungi il codice per la pagina iniziale in app.component.html.
- Casa
- Profilo
- Accesso
- Disconnettersi
Autenticazione angolare 6 con tutorial JWT
Quindi, importa il
RouterModule
e definire i percorsi in app.module.ts.importare RouterModule da '@ angular / router'; @NgModule (dichiarazioni: [AppComponent, LoginComponent, ProfileComponent], importa: [BrowserModule, RouterModule, FormsModule, RouterModule.forRoot ([path: ", redirectTo: '/', pathMatch: 'full', percorso: ' login ', componente: LoginComponent, percorso:' profilo ', componente: ProfileComponent]),] provider: [], bootstrap: [AppComponent]) classe di esportazione AppModuleCrea pagina di accesso
La pagina di accesso conterrà due campi di input per email e password e un pulsante di invio come mostrato di seguito:
Accesso
Crea pagina profilo
La pagina del profilo sarà semplicemente un messaggio come mostrato di seguito:
Se riesci a vedere questa pagina, sei loggato!
Auth con JWT in angolare
Inizieremo creando un
auth
Servizio che faciliterà la convalida dell'input dell'utente e della comunicazione con il server.// Crea un servizio di autenticazione denominato Auth ng g service AuthQuesto crea due file, ma saremo interessati principalmente al auth.service.ts file in cui scriveremo tutto il codice che interagisce con il server. Inizieremo definendo l'API REST e il token come mostrato di seguito:
export class AuthService api = 'http: // localhost: 3000 / api'; gettone;Successivamente, scriveremo il codice che esegue una richiesta POST al server con le credenziali dell'utente. Qui, facciamo una richiesta all'API: se ha successo, memorizziamo il token
memoria locale
e reindirizzare l'utente alla pagina del profilo.import Injectable da '@ angular / core'; import HttpClientModule, HttpClient da '@ angular / common / http'; importare Router da '@ angular / router'; @Injectable (providedIn: 'root') export class AuthService uri = 'http: // localhost: 5000 / api'; gettone; costruttore (http: HttpClient, router privato: router) login (email: string, password: string) this.http.post (this.uri + '/ authenticate', email: email, password: password) .subscribe ((resp: any) => this.router.navigate (['profile']); localStorage.setItem ('auth_token', resp.token);));Definiamo anche le funzioni di accesso e disconnessione come mostrato di seguito.
logout () localStorage.removeItem ('token'); public get logIn (): boolean return (localStorage.getItem ('token')! == null);
- disconnettersi-cancella il token dalla memoria locale
- accesso-restituisce una proprietà booleana che determina se un utente è autenticato
Quindi aggiorniamo il
accesso
proprietà sulla home page come mostrato.
- Casa
- Profilo
- Accesso
- Disconnettersi
Risposta agli eventi utente
Ora che abbiamo finito con il codice che interagisce con il server, passeremo alla gestione degli eventi generati dagli utenti per il front-end.
Scriveremo la funzione che ascolterà gli eventi di clic dalla pagina di accesso e quindi passerà i valori a
AuthService
per autenticare l'utente. Aggiorna il tuo login.component.ts file per assomigliare a questo:import Component, OnInit da '@ angular / core'; import Router, ActivatedRoute da '@ angular / router'; import AuthService da '... /auth.service'; @Component (selector: 'app-login', templateUrl: './login.component.html', styleUrls: ['./login.component.css']) classe di esportazione LoginComponent implementa OnInit email = "; password = "; costruttore (authService privato: AuthService) Login () console.log ("si sta effettuando l'accesso") this.authService.login (this.email, this.password) ngOnInit ()Ora se corri
ng servire
e vai a http: // localhost: 4200, puoi testare la tua app.ng servireFare clic sul collegamento di accesso e fornire le credenziali dell'utente: ricordare che le credenziali valide sono definite nell'app Express. Ora, quando fai clic sul pulsante di accesso, verrai reindirizzato alla pagina del profilo.
Conclusione
In questo tutorial, hai imparato come iniziare con l'autenticazione JWT in Angular. Ora puoi autenticare e autorizzare con JWT nelle tue applicazioni Angular. Ci sono molti aspetti di JWT che non sono stati trattati in questo tutorial: vedi se puoi esplorarne alcuni da soli!
Nota che questo tutorial è stato scritto per Angular 6, ma gli stessi concetti dovrebbero funzionare con Angular 2 o Angular 4.