Di blog ini, kami akan menerapkan otentikasi dengan JWT di aplikasi web NodeJS. Untuk ini, kami akan menggunakan jsonwebtoken paket
Apa itu JWT?
JWT (JSON Web Token) adalah format token. Ini ditandatangani secara digital, mandiri, dan kompak. Ini menyediakan mekanisme yang nyaman untuk mentransfer data. JWT tidak aman secara inheren, tetapi penggunaan JWT dapat memastikan keaslian pesan selama tanda tangan diverifikasi dan integritas muatan dapat dijamin. JWT sering digunakan untuk otentikasi stateless dalam kasus penggunaan sederhana yang melibatkan sistem non-kompleks.
Berikut contoh JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im9sYXR1bmRlZ2FydWJhQGdtYWlsLmNvbSIsIm
Sekarang, mari kita mengautentikasi/melindungi beberapa rute.
Prasyarat:
- Pengetahuan dasar tentang HTML/JavaScript
- NodeJS harus diinstal di sistem Anda.
- modul express untuk membuat server.
- modul luwak untuk koneksi dan kueri MongoDB.
- modul bcrypt untuk hashing.
Anda dapat menginstal semua paket yang diperlukan dengan menggunakan perintah berikut:
npm install express mongoose bcrypt --save
Langkah 1. Pertama, buat struktur direktori seperti di bawah ini :
JWTApp
-api
--models
----userModel.js
--controllers
----userController.js
--route
----userRoute.js
--server.js
Langkah 2. Instal “jsonwebtoken ” paket dengan menggunakan perintah berikut
npm install jsonwebtoken -- save
Langkah 3. Buat model pengguna
Di folder api/models, buat file bernama user userModel.js dengan menjalankan touch api/models/userModel.js.
Dalam file ini, buat skema luwak dengan properti berikut:
- Nama Lengkap
- alamat email
- sandi
- tanggal pembuatan
Tambahkan kode berikut
'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);
Langkah 4. Buat penangan pengguna
Di api/controllers folder, buat file bernama user userController.js dengan menjalankan touch api/controllers/userController.js
Dalam file userController, buat tiga penangan berbeda untuk ditangani dengan menggunakan kode berikut
'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' });
}
};
Catatan: Kata sandi hash disimpan dalam database menggunakan bcrypt.
Langkah 6. Di api/rute folder, buat file bernama user userRoute.js dan tambahkan kode berikut:
'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);
};
Langkah 7. Tambahkan kode berikut di 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;
Langkah 9. Sekarang Anda hanya perlu menjalankan proyek dengan menggunakan perintah berikut dan mencoba masuk dengan menggunakan JWT.
npm start
Langkah 10. Buka Postman dan buat permintaan posting ke localhost:3000/auth/register seperti di bawah ini:
Langkah 11. Setelah ini, mari masuk dengan URL ini localhost:3000/auth/sign_in . Masukkan kunci dan nilai untuk email dan kata sandi
Di bawah nilai, tambahkan JWT dan token dengan spasi di antaranya, seperti:
JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im9sYXR1bmRlZ2FydWJhQGdtYWlsLmNvbSIsImZ1bGxOYW1lIjoiT2xhdHVuZGUgR2FydWJhIiwiX2lkIjoiNThmMjYzNDdiMTY1YzUxODM1NDMxYTNkIiwiaWF0IjoxNDkyMjgwMTk4fQ.VcMpybz08cB5PsrMSr25En4_EwCGWZVFgciO4M-3ENE
Langkah 11. Kemudian, masukkan parameter untuk kunci dan nilai untuk mengambil profil. Anda ingin membuat seperti yang ditunjukkan di bawah ini dan kirim:
Seperti yang telah kita lihat, cukup mudah untuk membangun sistem otentikasi JWT dengan NodeJS, Anda dapat menemukan kode lengkap yang digunakan dalam tutorial ini di sini.
Catatan :Anda dapat memecahkan kode atau memverifikasi detail token JWT Anda dengan alat ini