I denne blog implementerer vi godkendelse med JWT i en NodeJS-webapplikation. Til dette bruger vi jsonwebtoken pakke
Hvad er JWT?
JWT(JSON Web Token) er et tokenformat. Det er digitalt signeret, selvstændigt og kompakt. Det giver en praktisk mekanisme til overførsel af data. JWT er ikke i sig selv sikker, men brugen af JWT kan sikre ægtheden af meddelelsen, så længe signaturen er verificeret, og nyttelastens integritet kan garanteres. JWT bruges ofte til statsløs godkendelse i simple use cases, der involverer ikke-komplekse systemer.
Her er et eksempel på JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im9sYXR1bmRlZ2FydWJhQGdtYWlsLmNvbSIsIm
Lad os nu godkende/beskytte nogle ruter.
Forudsætninger:
- Grundlæggende kendskab til HTML/JavaScript
- NodeJS bør være installeret i dit system.
- ekspressmodul til oprettelse af serveren.
- mongoose-modul til MongoDB-forbindelse og forespørgsler.
- bcrypt-modul til hashing.
du kan installere alle nødvendige pakker ved at bruge følgende kommando:
npm install express mongoose bcrypt --save
Trin 1. Opret først en mappestruktur som nedenfor:
JWTApp
-api
--models
----userModel.js
--controllers
----userController.js
--route
----userRoute.js
--server.js
Trin 2. Installer “jsonwebtoken ”-pakke ved at bruge følgende kommando
npm install jsonwebtoken -- save
Trin 3. Opret brugermodellen
I mappen api/models skal du oprette en fil kaldet userModel.js ved at køre touch api/models/userModel.js.
I denne fil skal du oprette et mongoose-skema med følgende egenskaber:
- fuldt navn
- e-mailadresse
- adgangskode
- oprettelsesdatoen
Tilføj følgende kode
'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);
Trin 4. Opret brugerbehandlerne
I api/controllere mappe, skal du oprette en fil kaldet user userController.js ved at køre touch api/controllers/userController.js
I userController-filen skal du oprette tre forskellige handlere, der skal håndteres ved at bruge følgende kode
'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' });
}
};
Bemærk: En hash-adgangskode blev gemt i databasen ved hjælp af bcrypt.
Trin 6. I api/rute mappe, skal du oprette en fil kaldet userRoute.js og tilføje følgende kode:
'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);
};
Trin 7. Tilføj følgende kode 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;
Trin 9. Nu skal du bare køre projektet ved at bruge følgende kommando og prøve at logge ved hjælp af JWT.
npm start
Trin 10. Åbn Postman, og opret en postanmodning til localhost:3000/auth/register som nedenfor:
Trin 11. Lad os derefter logge med denne URL localhost:3000/auth/sign_in . Indtast nøglerne og værdierne for e-mail og adgangskode
Under værdien skal du tilføje JWT og tokenet med et mellemrum, som sådan:
JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im9sYXR1bmRlZ2FydWJhQGdtYWlsLmNvbSIsImZ1bGxOYW1lIjoiT2xhdHVuZGUgR2FydWJhIiwiX2lkIjoiNThmMjYzNDdiMTY1YzUxODM1NDMxYTNkIiwiaWF0IjoxNDkyMjgwMTk4fQ.VcMpybz08cB5PsrMSr25En4_EwCGWZVFgciO4M-3ENE
Trin 11. Indtast derefter parametrene for nøglen og værdien for at hente profilen. Du vil oprette som vist nedenfor og sende:
Som vi har set er det ret nemt at bygge et JWT-godkendelsessystem med NodeJS. Du kan finde den komplette kode, der bruges i denne tutorial her.
Bemærk:Du kan afkode eller verificere dine JWT-tokendetaljer med dette værktøj