Beveiliging is een belangrijk onderdeel van elke web-app en ontwikkelaars moeten ervoor zorgen dat ze apps ontwerpen met veilige authenticatie. In deze tutorial leert u hoe u JWT-gebaseerde authenticatie in Angular-apps kunt implementeren met behulp van een eenvoudige Express-server.
De volledige code is te vinden in onze GitHub-repo. De app die we gaan bouwen ziet er als volgt uit:
Een JSON Web Token (JWT) is in feite een object dat wordt vertegenwoordigd door drie strings die worden gebruikt om gebruikersinformatie te verzenden. De drie strings, die worden gescheiden door punten, zijn:
Wanneer een gebruiker met zijn gebruikersnaam en wachtwoord inlogt op een webpagina, maakt de authenticeringsserver gewoonlijk een JWT aan en verzendt deze. Deze JWT wordt vervolgens doorgegeven met daaropvolgende API-aanroepen naar de server. De JWT blijft geldig, tenzij deze vervalt of de gebruiker uitlogt.
Dit proces kan in het onderstaande schema worden geïllustreerd.
We zullen lokale opslag gebruiken om tokens op te slaan. Lokale opslag is een middel waarmee gegevens lokaal worden opgeslagen en kunnen alleen worden verwijderd via JavaScript of door de cache in de browser te wissen. Gegevens die zijn opgeslagen in lokale opslag kunnen zeer lang blijven bestaan. Cookies zijn echter berichten die van de server naar de browser worden verzonden en die slechts een beperkte opslagruimte bieden.
We beginnen met het bouwen van een back-end-server met de volgende eindpunten:
Laten we beginnen door een map te maken voor de Express-toepassing en vervolgens de opdracht uitvoeren npm init
om de vereiste bestanden voor het project in te stellen.
mkdir server cd server npm init
Maak vervolgens een bestand server.js en installeer de modules: uitdrukken
, jsonwebtoken
, cors
, en bodyParser
.
druk op server.js npm installeer express jsonwebtoken cors bodyParser -save
Nu open server.js en begin met het importeren van de modules.
// server.js const cors = require ('cors'); const bodyParser = require ('body-parser'); const jwt = require ('jsonwebtoken'); const express = vereisen ('express');
Maak vervolgens een Express-app en definieer de geheime sleutel die wordt gebruikt om de gebruikersgegevens te coderen en te decoderen.
// CREëER EXPRESS APP const app = express (); app.use (cors ()); app.use (bodyParser.json ()); // DECLARE JWT-secret const JWT_Secret = 'your_secret_key';
We zullen geen database gebruiken voor dit voorbeeld. De concepten zouden echter vergelijkbaar zijn als u een goede door een database ondersteunde server zou bouwen.
Voor ons voorbeeld gebruiken we gewoon een variabele om een testgebruiker te definiëren, zoals hieronder wordt getoond.
var testUser = email: '[email protected]', wachtwoord: '1234';
De laatste stap is om routes te maken voor authenticatie van de gebruiker.
app.post ('/ api / authenticate', (req, res) => if (req.body) var user = req.body; console.log (user) if (testUser.email === req.body .email && testUser.password === req.body.password) var token = jwt.sign (user, JWT_Secret); res.status (200) .send (signed_user: user, token: token); else res.status (403) .send (errorMessage: 'Autorisatie vereist!'); else res.status (403) .send (errorMessage: 'Geef e-mailadres en wachtwoord op);) ;
Laten we de code voor de bovenstaande route opsplitsen.
We controleren eerst of er gegevens in de hoofdtekst van het verzoek zijn. Als er geen gegevens worden gevonden, vragen we de gebruiker om wat gegevens in te voeren. Bij gelegenheid dat de gebruiker de juiste gegevens heeft verstrekt, vergelijken we deze met de gegevens van de testuser
en als het overeenkomt, gebruiken we het gebruikers-ID om een uniek token te genereren en het antwoord terug te sturen naar de gebruiker.
Ten slotte maken we een eindpunt voor het uitvoeren van de app.
app.listen (5000, () => console.log ('Server gestart op poort 5000'));
Onze back-end is nu voltooid en u kunt deze testen met Postmanof CURL en zie het soort gegevens dat aan de gebruiker wordt geretourneerd.
Onze Angular applicatie zal de volgende pagina's bevatten:
Maak een Angular-applicatie en maak de Log in
en Profiel
componenten zoals hieronder getoond:
ng nieuwe angular6jwt cd angular6jwt ng g component Aanmelden ng g component Profiel
Voeg vervolgens de code voor de startpagina toe app.component.html.
- Huis
- Profiel
- Log in
- Uitloggen
Hoek 6 verificatie met JWT-zelfstudie
Importeer vervolgens de
Routermodule
en definieer de routes in app.module.ts.importeer RouterModule van '@ angular / router'; @ NgModule (aangiften: [AppComponent, LoginComponent, ProfileComponent], import: [BrowserModule, RouterModule, FormsModule, RouterModule.forRoot ([path: ", redirectTo: '/', pathMatch: 'full', path: ' login ', component: LoginComponent, pad:' profile ', component: ProfileComponent]),], providers: [], bootstrap: [AppComponent]) exportklasse AppModuleAanmeldingspagina maken
De aanmeldingspagina bevat twee invoervelden voor e-mail en wachtwoord en een verzendknop zoals hieronder weergegeven:
Log in
Profielpagina maken
De profielpagina zal slechts een eenvoudig bericht zijn zoals hieronder getoond:
Als u deze pagina kunt zien, bent u ingelogd!
Auth met JWT in Angular
We beginnen met het maken van een
Auth
Dienst die de validatie van gebruikersinvoer en communicatie met de server zal vergemakkelijken.// Verificatieservice maken met de naam Auth ng g-service AuthDit creëert twee bestanden, maar we zullen vooral geïnteresseerd zijn in de auth.service.ts bestand waar we alle code schrijven die met de server communiceert. We beginnen met het definiëren van de REST API en het token zoals hieronder getoond:
exportklasse AuthService api = 'http: // localhost: 3000 / api'; token;Vervolgens zullen we de code schrijven die een POST-aanvraag uitvoert naar de server met de gebruikersreferenties. Hier doen we een verzoek aan de API. Als het lukt, slaan we het token op
lokale opslag
en stuur de gebruiker door naar de profielpagina.Injectable importeren vanuit '@ angular / core'; importeer HttpClientModule, HttpClient van '@ angular / common / http'; importeer Router van '@ angular / router'; @Injectable (providedIn: 'root') exportklasse AuthService uri = 'http: // localhost: 5000 / api'; token; constructor (privé http: HttpClient, privé-router: Router) login (email: string, wachtwoord: string) this.http.post (this.uri + '/ authenticate', email: email, password: password) .subscribe ((resp: any) => this.router.navigate (['profile']); localStorage.setItem ('auth_token', resp.token);));We definiëren ook inlog- en uitlogfuncties zoals hieronder getoond.
uitloggen () localStorage.removeItem ('token'); public get logIn (): boolean return (localStorage.getItem ('token')! == null);
- uitloggen-wist het token uit de lokale opslag
- Log in-retourneert een boolean-eigenschap die bepaalt of een gebruiker is geverifieerd
Vervolgens werken we het
Log in
eigenschap op de startpagina zoals weergegeven.
- Huis
- Profiel
- Log in
- Uitloggen
Reageren op gebruikersgebeurtenissen
Nu we klaar zijn met de code die interactie heeft met de server, gaan we verder met het behandelen van door gebruikers gegenereerde evenementen voor de front-end.
We zullen de functie schrijven die naar klikgebeurtenissen luistert vanaf de inlogpagina en vervolgens de waarden doorgeven aan de
AuthService
om de gebruiker te authenticeren. Update uw login.component.ts bestand om er zo uit te zien:importeer Component, OnInit uit '@ angular / core'; import Router, ActivatedRoute van '@ angular / router'; import AuthService van '... /auth.service'; @Component (selector: 'app-login', templateUrl: './login.component.html', styleUrls: ['./login.component.css']) export class LoginComponent implementeert OnInit email = "; wachtwoord = "; constructor (private authService: AuthService) Login () console.log ("u logt in") this.authService.login (this.email, this.password) ngOnInit ()Nu, als je rent
ng serveren
en navigeer naar http: // localhost: 4200, je kunt je app testen.ng serverenKlik op de aanmeldingslink en geef de gebruikersreferenties op. Onthoud dat de geldige legitimatiegegevens zijn gedefinieerd in de Express-app. Nu, wanneer u op de login-knop klikt, wordt u doorgestuurd naar de profielpagina.
Conclusie
In deze zelfstudie hebt u geleerd hoe u aan de slag kunt gaan met JWT-verificatie in Angular. Nu kunt u authenticeren en autoriseren met JWT in uw Angular-applicaties. Er zijn veel aspecten van JWT die niet werden behandeld in deze zelfstudie - kijk of je sommige zelf kunt verkennen!
Merk op dat deze tutorial geschreven was voor Angular 6, maar dezelfde concepten zouden moeten werken met Angular 2 of Angular 4.