So erstellen Sie eine API-Authentifizierung mit JWTs und Passport

Blog

So erstellen Sie eine API-Authentifizierung mit JWTs und Passport

Jede Webanwendung und API verwendet eine Form der Authentifizierung, um Ressourcen zu schützen und sie auf verifizierte Benutzer zu beschränken. Wir werden durchgehen, wie Sie eine Authentifizierung für eine API mit JWTs (JSON Web Tokens) und einem Paket-Passport erstellen. Lassen Sie uns eine kurze Einführung in ihre Funktionsweise geben.



Inhaltsverzeichnis

  • JSON-Webtoken
  • Reisepass
  • Einrichten des Projekts
  • Einrichten der Datenbank
  • Registrierungs- und Login-Middleware
  • Erstellen der Routen
  • Unterzeichnung des JWT
  • Überprüfen des Benutzertokens
  • Sichere Routen erstellen
  • Testen mit Postman
  • Abschluss

JSON Web Token (JWTs)

Entsprechend JWT.IO






JSON-Webtoken (JWT) ist ein offener Standard (RFC 7519), der einen kompakten und in sich geschlossenen Weg für die sichere Übertragung von Informationen zwischen Parteien als JSON-Objekt definiert.



Jetzt JWTs sind sicher, da sie digital signiert sind und wenn die darin enthaltenen Informationen in irgendeiner Weise manipuliert werden, wird dieses Token ungültig. Wie das möglich ist, schauen wir uns später an. JWT'S bestehen aus drei durch Punkte getrennten Teilen.



Header : dies enthält die Art des Algorithmus, der verwendet wird, um das Token zu verifizieren, und die Art des Tokens, z






{ 'type' : 'JWT', 'alg' : 'HS256' }

* Nutzlast * : enthält die Ansprüche. Ansprüche sind Informationen über den Benutzer zusammen mit anderen zusätzlichen Metadaten, z

{ id : 1 name : 'devgson' iat : 1421211952 }

Hinweis: |_+_| ist ein Metadaten, der das Datum und die Uhrzeit angibt, zu der das Token signiert wurde. Weitere Informationen zu Metadaten finden Sie Hier .

Unterschrift : Die Signatur kodiert die Informationen in Header und Payload in |_+_| zusammen mit einem geheimen Schlüssel formatieren. Alle diese Informationen werden dann von dem im Header angegebenen Algorithmus signiert, zB HMACSHA256. Die Signatur bestätigt, dass die gesendete Nachricht auf dem Weg nicht manipuliert wurde.

iat

Hinweis: JWTs sollten nicht zum Übertragen/Speichern sicherer Informationen verwendet werden, da jeder, der es schafft, den Token abzufangen, den Header und die darin enthaltene Nutzlast leicht entschlüsseln kann, er ist nur in|_+_| . codiert schließlich formatieren. Die Signatur überprüft lediglich, dass das Token in keiner Weise manipuliert wurde. Es verhindert nicht, dass das Token manipuliert wird. Es gibt jedoch zusätzliche Sicherheitsmaßnahmen, die ergriffen werden können, um ein höheres Sicherheitsniveau zu erreichen. Für eine umfassende und eingehende Erklärung der JWTs lesen Sie dies Buchen

Reisepass

Reisepass ist ein Authentifizierung Middleware, wird verwendet, um Anfragen zu authentifizieren, verwendet Strategien, z. B. lokale Strategie oder mit dem Aufkommen sozialer Netzwerke, Single Sign-On mit OAuth Anbieter wie Facebook oder twittern. Anwendungen können wählen, welche Strategien sie anwenden möchten, und es gibt individuelle Pakete für jede Strategie. In diesem Tutorial verwenden wir die lokale Strategie (E-Mail/Passwort). Weitere Informationen zum Reisepass und den verfügbaren Strategien finden Sie hier Hier . Jetzt fangen wir an.

Einrichten des Projekts

Lassen Sie uns eine Ordnerstruktur für die Dateien erstellen, die wir verwenden werden:

base64

Installieren Sie die erforderlichen Pakete

HMACSHA256( base64UrlEncode(header) + '.' + base64UrlEncode(payload), secret )

|_+_| : zum Hashing von Benutzerpasswörtern, |_+_| : zum Signieren von Token, |_+_| : Paket zur Implementierung der lokalen Strategie, Passport-jwt : Middleware zum Abrufen und Verifizieren von JWTs. So funktioniert unsere Anwendung:

wo kann man dag kaufen
  • Der Benutzer registriert sich und meldet sich dann an, nachdem sich der Benutzer angemeldet hat, wird dem Benutzer ein JSON-Webtoken übergeben.
  • Es wird erwartet, dass der Benutzer dieses Token lokal speichert.
  • Dieses Token muss vom Benutzer gesendet werden, wenn er versucht, auf bestimmte sichere Routen zuzugreifen. Nachdem der Token verifiziert wurde, darf der Benutzer auf die Route zugreifen. Kommen wir nun zur Codierung.

Einrichten der Datenbank

Zunächst erstellen wir das Benutzerschema. Ein Benutzer sollte nur E-Mail und Passwort angeben, das wären genug Informationen.

base64

Jetzt wollen wir Passwörter nicht im Klartext speichern, denn wenn es einem Angreifer gelingt, Zugriff auf die Datenbank zu bekommen, kann das Passwort leicht gelesen werden, also wollen wir dies vermeiden. Wir verwenden ein Paket namens „bcrypt“, um Benutzerpasswörter zu hashen und sie sicher zu speichern.

-model ---model.js -routes ---routes.js ---secure-routes.js -auth ---auth.js -app.js -package.json

Registrierungs- und Login-Middleware

Wir verwenden die lokale Passportstrategie, um Middleware zu erstellen, die die Benutzerregistrierung und -anmeldung übernimmt. Dieser wird dann in bestimmte Routen eingesteckt und zur Authentifizierung verwendet.

$ npm install --save bcrypt body-parser express jsonwebtoken mongoose passport passport-local passport-jwt

Erstellen der Routen

Da wir nun über Middleware für die Registrierung und Anmeldung verfügen, erstellen wir Routen, die diese Middleware verwenden.

bcrypt

Unterzeichnung des JWT

Wenn sich der Benutzer anmeldet, werden die Benutzerinformationen an unseren benutzerdefinierten Rückruf übergeben, der wiederum ein sicheres Token mit den Informationen erstellt. Dieses Token muss dann beim Zugriff auf sichere Routen (die wir später erstellen) als Abfrageparameter übergeben werden.

jsonwebtoken

Hinweis: Wir setzen |_+_| weil wir die Benutzerdaten nicht in einer Sitzung speichern möchten. Wir erwarten, dass der Benutzer das Token bei jeder Anfrage an die sicheren Routen sendet. Dies ist besonders nützlich für APIs, es kann verwendet werden, um Benutzer zu verfolgen, zu blockieren usw., aber wenn Sie vorhaben, Sitzungen zusammen mit JWTs zu verwenden, um eine Webanwendung zu sichern, ist dies möglicherweise keine wirklich gute Idee in Bezug auf die Leistung, mehr Details dazu Hier .

Überprüfen des Benutzertokens

Jetzt haben wir uns also mit der Benutzeranmeldung und -anmeldung befasst. Der nächste Schritt besteht darin, Benutzern mit Token den Zugriff auf bestimmte sichere Routen zu ermöglichen, aber wie überprüfen wir, ob der vom Benutzer gesendete Token gültig ist und nicht in irgendeiner Weise oder einfach nur manipuliert wurde? ungültig. Machen wir das als nächstes.

passport-local

Hinweis : Wenn Sie zusätzliche oder sensible Details zum Benutzer benötigen, die nicht im Token verfügbar sind, können Sie die im Token verfügbare _id verwenden, um sie aus der Datenbank abzurufen.

Sichere Routen erstellen

Jetzt können wir einige sichere Routen erstellen, auf die nur Benutzer mit verifizierten Token zugreifen können.

model/model.js const mongoose = require('mongoose') const bcrypt = require('bcrypt'); const Schema = mongoose.Schema; const UserSchema = new Schema({ email : { type : String, required : true, unique : true }, password : { type : String, required : true } }); ...

Jetzt sind wir also alle mit dem Erstellen der Routen und der Authentifizierungs-Middleware fertig, lassen Sie uns alles zusammenstellen und dann testen.

model/model.js .... //This is called a pre-hook, before the user information is saved in the database //this function will be called, we'll get the plain text password, hash it and store it. UserSchema.pre('save', async function(next){ //'this' refers to the current document about to be saved const user = this; //Hash the password with a salt round of 10, the higher the rounds the more secure, but the slower //your application becomes. const hash = await bcrypt.hash(this.password, 10); //Replace the plain text password with the hash and then store it this.password = hash; //Indicates we're done and moves on to the next middleware next(); }); //We'll use this later on to make sure that the user trying to log in has the correct credentials UserSchema.methods.isValidPassword = async function(password){ const user = this; //Hashes the password sent by the user for login and checks if the hashed password stored in the //database matches the one sent. Returns true if it does else false. const compare = await bcrypt.compare(password, user.password); return compare; } const UserModel = mongoose.model('user',UserSchema); module.exports = UserModel;

Testen mit Postman

Nachdem wir nun alles zusammengestellt haben, verwenden wir postman, um unsere API zu testen Authentifizierung . Zuerst müssen wir uns mit einer E-Mail und einem Passwort anmelden. Wir können diese Daten über die |_+_| unserer Anfrage. Wenn das erledigt ist, klicke auf den Senden-Button, um die |_+_| . zu starten Anfrage.

wo kaufen ergo

So erstellen Sie eine API-Authentifizierung für eine API mit JWT

Wir können sehen, dass das Passwort verschlüsselt ist, daher hat jeder mit Zugriff auf die Datenbank nur Zugriff auf das gehashte Passwort. Wir haben zehn (10) Salt Rounds hinzugefügt, um die Sicherheit zu erhöhen. Sie können mehr darüber lesen Hier . Melden wir uns nun mit den Zugangsdaten an und erhalten unser Token. Besuchen Sie die |_+_| route, übergeben Sie die zuvor verwendete E-Mail-Adresse und das Passwort und leiten Sie dann die Anfrage ein.

So erstellen Sie eine API-Authentifizierung für eine API mit JWT

Jetzt haben wir unser Token, wir senden dieses Token immer dann, wenn wir auf eine sichere Route zugreifen möchten. Versuchen wir dies, indem wir auf eine sichere Route zugreifen |_+_|, wir übergeben unser Token in einem Abfrageparameter namens |_+_|. Das Token wird gesammelt, verifiziert und wir erhalten Zugriff auf die Route, wenn es gültig.

So erstellen Sie eine API-Authentifizierung für eine API mit JWT

Wie Sie sehen, ermöglicht uns das gültige Token den Zugriff auf den sicheren Weg. Sie können versuchen, auf diese Route zuzugreifen, aber mit einem ungültigen Token gibt die Anfrage ein |_+_| . zurück Error.

Abschluss

JSON-Webtoken bieten eine sichere Methode zum Erstellen einer Authentifizierung. Eine zusätzliche Sicherheitsebene kann hinzugefügt werden, indem alle Informationen innerhalb des Tokens verschlüsselt werden, wodurch es noch sicherer wird.

#node-js #api #javascript