Skip to content

Commit e41936f

Browse files
authored
Merge pull request #33 from dz-ai/jwt_binding_with_machine
The User IP added to the JWT token's payload. In addition, the IP is …
2 parents 943064c + ec6ac82 commit e41936f

File tree

3 files changed

+39
-11
lines changed

3 files changed

+39
-11
lines changed

controller/auth.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const { genrateToken, sendOTP } = require('../util');
1+
const { generateToken, sendOTP } = require('../util');
22
const user = require('../models/user');
33

44
otpStore = {}
@@ -13,7 +13,7 @@ exports.login = async function(req, res, next) {
1313
"emailId":userValidated.emailId,
1414
"type": userValidated.userType,
1515
}
16-
let token = genrateToken(userDetails);
16+
let token = generateToken(userDetails, req.ip);
1717
userDetails["token"] = token;
1818
res.send({res:"welcome", user:userDetails})
1919
}
@@ -36,7 +36,7 @@ exports.sendOTP = async function(req, res, next){
3636
sendOTP(emailId, otp);
3737
res.send({res:"otp sent to emailID"})
3838
}
39-
else{
39+
else{
4040
res.send({err:"incorrect UID or emailId"})
4141
}
4242
}

middleware/auth.js

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,25 @@
11
const jwt = require('jsonwebtoken');
2+
const { decrypt } = require('../util')
23

34
function authenticateToken(req, res, next) {
45
const authHeader = req.headers['authorization'];
56
const token = authHeader && authHeader.split(' ')[1];
67
if (token == null) return res.sendStatus(401);
7-
jwt.verify(token, process.env.TOKEN_SECRET, (err, user) => {
88

9-
if (err) return res.sendStatus(403);
10-
11-
req.user = user;
9+
try {
10+
const payload = jwt.verify(token, process.env.TOKEN_SECRET);
11+
const decryptedIP = decrypt(payload.ip);
12+
if (decryptedIP !== req.ip) {
13+
res.status(403)
14+
res.send({err:"Unauthorized"});
15+
}
1216

17+
req.user = payload.data;
1318
next();
14-
})
19+
} catch (error) {
20+
res.status(403)
21+
res.send({err:"Unauthorized"});
22+
}
1523
}
1624

1725
module.exports = authenticateToken;

util.js

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const jwt = require("jsonwebtoken");
22
const nodemailer = require("nodemailer");
3+
const crypto = require("crypto");
34
require("dotenv").config()
45

56
const transporter = nodemailer.createTransport({
@@ -11,9 +12,28 @@ const transporter = nodemailer.createTransport({
1112
},
1213
});
1314

14-
exports.genrateToken = (data)=>{
15-
return jwt.sign(data, process.env.TOKEN_SECRET);
16-
}
15+
const key = crypto.randomBytes(32);
16+
const iv = crypto.randomBytes(16);
17+
const algorithm = 'aes-256-cbc';
18+
19+
exports.generateToken = (data, IP)=>{
20+
const encryptedIP = this.encrypt(IP);
21+
return jwt.sign({data: data, ip: encryptedIP}, process.env.TOKEN_SECRET);
22+
}
23+
24+
exports.encrypt = (IP) => {
25+
const cipher = crypto.createCipheriv(algorithm, key, iv);
26+
let encrypted = cipher.update(IP, 'utf8', 'hex');
27+
encrypted += cipher.final('hex');
28+
return encrypted;
29+
}
30+
31+
exports.decrypt = (IP) => {
32+
const decipher = crypto.createDecipheriv(algorithm, key, iv);
33+
let decrypted = decipher.update(IP, 'hex', 'utf8');
34+
decrypted += decipher.final('utf8');
35+
return decrypted;
36+
}
1737

1838
exports.sendOTP = async (to, otp)=>{
1939
let info = await transporter.sendMail({

0 commit comments

Comments
 (0)