I den här bloggen kommer vi att implementera autentisering med JWT i en NodeJS-webbapplikation. För detta kommer vi att använda jsonwebtoken paket
Vad är JWT?
JWT(JSON Web Token) är ett tokenformat. Den är digitalt signerad, fristående och kompakt. Det ger en bekväm mekanism för att överföra data. JWT är inte i sig säkert, men användningen av JWT kan säkerställa meddelandets äkthet så länge som signaturen är verifierad och integriteten hos nyttolasten kan garanteras. JWT används ofta för tillståndslös autentisering i enkla användningsfall som involverar icke-komplexa system.
Här är ett exempel på JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im9sYXR1bmRlZ2FydWJhQGdtYWlsLmNvbSIsIm
Nu ska vi autentisera/skydda några rutter.
Förutsättningar:
- Grundläggande kunskaper om HTML/JavaScript
- NodeJS bör installeras i ditt system.
- expressmodul för att skapa servern.
- mongoosemodul för MongoDB-anslutning och frågor.
- bcrypt-modul för hash.
du kan installera alla nödvändiga paket genom att använda följande kommando:
npm install express mongoose bcrypt --save
Steg 1. Skapa först en katalogstruktur enligt nedan :
JWTApp
-api
--models
----userModel.js
--controllers
----userController.js
--route
----userRoute.js
--server.js
Steg 2. Installera "jsonwebtoken ” paket genom att använda följande kommando
npm install jsonwebtoken -- save
Steg 3. Skapa användarmodellen
I mappen api/models skapar du en fil som heter userModel.js genom att köra touch api/models/userModel.js.
I den här filen skapar du ett mongoose-schema med följande egenskaper:
- fullständigt namn
- e-postadress
- lösenord
- det skapade datumet
Lägg till följande kod
'use strict';
var mongoose = require('mongoose'),
bcrypt = require('bcrypt'),
Schema = mongoose.Schema;
/**
* User Schema
*/
var UserSchema = new Schema({
fullName: {
type: String,
trim: true,
required: true
},
email: {
type: String,
unique: true,
lowercase: true,
trim: true,
required: true
},
hash_password: {
type: String
},
created: {
type: Date,
default: Date.now
}
});
UserSchema.methods.comparePassword = function(password) {
return bcrypt.compareSync(password, this.hash_password);
};
mongoose.model('User', UserSchema);
Steg 4. Skapa användarhanterare
I api/kontroller mapp skapar du en fil som heter userController.js genom att köra touch api/controllers/userController.js
I userController-filen skapar du tre olika hanterare att hantera genom att använda följande kod
'use strict';
var mongoose = require('mongoose'),
jwt = require('jsonwebtoken'),
bcrypt = require('bcrypt'),
User = mongoose.model('User');
exports.register = function(req, res) {
var newUser = new User(req.body);
newUser.hash_password = bcrypt.hashSync(req.body.password, 10);
newUser.save(function(err, user) {
if (err) {
return res.status(400).send({
message: err
});
} else {
user.hash_password = undefined;
return res.json(user);
}
});
};
exports.sign_in = function(req, res) {
User.findOne({
email: req.body.email
}, function(err, user) {
if (err) throw err;
if (!user || !user.comparePassword(req.body.password)) {
return res.status(401).json({ message: 'Authentication failed. Invalid user or password.' });
}
return res.json({ token: jwt.sign({ email: user.email, fullName: user.fullName, _id: user._id }, 'RESTFULAPIs') });
});
};
exports.loginRequired = function(req, res, next) {
if (req.user) {
next();
} else {
return res.status(401).json({ message: 'Unauthorized user!!' });
}
};
exports.profile = function(req, res, next) {
if (req.user) {
res.send(req.user);
next();
}
else {
return res.status(401).json({ message: 'Invalid token' });
}
};
Obs! Ett hash-lösenord sparades i databasen med bcrypt.
Steg 6. I api/routen skapa en fil som heter userRoute.js och lägg till följande kod:
'use strict';
module.exports = function(app) {
var userHandlers = require('../controllers/userController.js');
// todoList Routes
app.route('/tasks')
.post(userHandlers.loginRequired, userHandlers.profile);
app.route('/auth/register')
.post(userHandlers.register);
app.route('/auth/sign_in')
.post(userHandlers.sign_in);
};
Steg 7. Lägg till följande kod i server.js
'use strict';
var express = require('express'),
app = express(),
port = process.env.PORT || 3000,
User = require('./api/models/userModel'),
bodyParser = require('body-parser'),
jsonwebtoken = require("jsonwebtoken");
const mongoose = require('mongoose');
const option = {
socketTimeoutMS: 30000,
keepAlive: true,
reconnectTries: 30000
};
const mongoURI = process.env.MONGODB_URI;
mongoose.connect('mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb', option).then(function(){
//connected successfully
}, function(err) {
//err handle
});
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(function(req, res, next) {
if (req.headers && req.headers.authorization && req.headers.authorization.split(' ')[0] === 'JWT') {
jsonwebtoken.verify(req.headers.authorization.split(' ')[1], 'RESTFULAPIs', function(err, decode) {
if (err) req.user = undefined;
req.user = decode;
next();
});
} else {
req.user = undefined;
next();
}
});
var routes = require('./api/routes/userRoutes');
routes(app);
app.use(function(req, res) {
res.status(404).send({ url: req.originalUrl + ' not found' })
});
app.listen(port);
console.log(' RESTful API server started on: ' + port);
module.exports = app;
Steg 9. Nu behöver du bara köra projektet genom att använda följande kommando och försöka logga med hjälp av JWT.
npm start
Steg 10. Öppna Postman och skapa en inläggsbegäran till localhost:3000/auth/register enligt nedan:
Steg 11. Efter detta, låt oss signera med den här webbadressen localhost:3000/auth/sign_in . Ange nycklar och värden för e-post och lösenord
Lägg till JWT och token under värdet med ett mellanslag mellan, som så:
JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im9sYXR1bmRlZ2FydWJhQGdtYWlsLmNvbSIsImZ1bGxOYW1lIjoiT2xhdHVuZGUgR2FydWJhIiwiX2lkIjoiNThmMjYzNDdiMTY1YzUxODM1NDMxYTNkIiwiaWF0IjoxNDkyMjgwMTk4fQ.VcMpybz08cB5PsrMSr25En4_EwCGWZVFgciO4M-3ENE
Steg 11. Ange sedan parametrarna för nyckeln och värdet för att hämta profilen. Du vill skapa som visas nedan och skicka:
Som vi har sett är det ganska enkelt att bygga ett JWT-autentiseringssystem med NodeJS. Du kan hitta hela koden som används i denna handledning här.
Obs! Du kan avkoda eller verifiera dina JWT-tokendetaljer med det här verktyget