Skip to content

Commit f96c053

Browse files
committed
protecting end point and generating token
1 parent ec3f9cc commit f96c053

7 files changed

Lines changed: 153 additions & 1 deletion

File tree

api/v1/login/LoginController.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
const { authentication } = require('./loginService');
2+
3+
async function index(req, res, next) {
4+
const { message, error } = await authentication(req.body);
5+
if (error) return next(error);
6+
return res.header('x-auth-token', message.token).send(message);
7+
}
8+
9+
module.exports = {
10+
index,
11+
};

api/v1/login/LoginTest.js

Whitespace-only changes.

api/v1/login/loginRoute.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
const router = require('express-promise-router')();
2+
3+
const { index } = require('./LoginController');
4+
const { authRoute } = require('../../../config/appRouteList');
5+
6+
const { root } = authRoute;
7+
8+
router.post(root, index);
9+
10+
module.exports = router;

api/v1/login/loginService.js

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
const Joi = require('joi');
2+
const bcrypt = require('bcrypt');
3+
const jwt = require('jsonwebtoken');
4+
5+
6+
const { User } = require('../user/UserModel');
7+
8+
const JoiLoginSchema = {
9+
username: Joi.string().min(6).max(255).required(),
10+
password: Joi.string().min(8).max(255).required(),
11+
};
12+
13+
function validation(credentials) {
14+
return Joi.validate(credentials, JoiLoginSchema);
15+
}
16+
17+
async function tokenGenerator(id, username) {
18+
const token = await jwt.sign({ id, username }, process.env.APP_SECRET, { expiresIn: '30d' });
19+
return token;
20+
}
21+
22+
async function authentication(reqBody) {
23+
const result = {
24+
message: '',
25+
error: '',
26+
};
27+
28+
const { error } = validation(reqBody);
29+
if (error) {
30+
result.error = { message: error.details[0].message, status: 400 };
31+
return result;
32+
}
33+
34+
const user = await User.findOne({ username: reqBody.username });
35+
if (!user) {
36+
result.error = { message: 'user is not found in our databases', status: 404 };
37+
return result;
38+
}
39+
40+
const match = await bcrypt.compare(reqBody.password, user.password);
41+
if (!match) {
42+
result.error = { message: 'the entered username or password is invalid!', status: 400 };
43+
return result;
44+
}
45+
const token = await tokenGenerator(user.id, user.username);
46+
result.message = {
47+
authenticated: true,
48+
userId: user.id,
49+
username: user.username,
50+
token,
51+
};
52+
return result;
53+
}
54+
55+
module.exports = {
56+
authentication,
57+
};

config/appConfiguration.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
const compression = require('compression');
2+
const paginate = require('express-paginate');
3+
4+
const {
5+
authRoute,
6+
userRoute,
7+
} = require('./appRouteList');
8+
const users = require('../api/v1/user/userRoute');
9+
const login = require('../api/v1/login/loginRoute');
10+
const errorHandler = require('../middleware/errorHandler');
11+
const logHandler = require('../middleware/logHandler');
12+
const corsMiddleware = require('../middleware/cors');
13+
const helmetMiddleware = require('../middleware/helmet');
14+
const { RateLimiter } = require('../middleware/rateLimiter');
15+
const { tooBusyMiddleware } = require('../middleware/tooBusy');
16+
const { translatorMiddleware } = require('../middleware/translator');
17+
18+
module.exports = (app) => {
19+
app.use(compression());
20+
app.use(helmetMiddleware);
21+
app.use(logHandler);
22+
app.use(tooBusyMiddleware);
23+
app.use(corsMiddleware);
24+
app.use(new RateLimiter(15, 100).limiter);
25+
app.use(translatorMiddleware);
26+
app.get('/', (req, res) => res.json({ message: 'Server is up and running...' }));
27+
app.use(authRoute.BaseRoute, login);
28+
app.use(paginate.middleware(10, 50));
29+
app.use(userRoute.BaseRoute, users);
30+
app.use('*', (req, res) => {
31+
const error = {
32+
message: 'I don\'t blame you.It is my mistake, or may be you\'re calling a wrong endpoint',
33+
status: 404,
34+
};
35+
res.status(404).json(error);
36+
});
37+
app.use(errorHandler);
38+
};

middleware/authorization.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
const jwt = require('jsonwebtoken');
2+
3+
// const { getUser } = require('../services/user.service');
4+
5+
async function isAuthorized(req, res, next) {
6+
if (req.path === '/create') return next();
7+
const token = req.get('x-auth-token');
8+
if (!token) {
9+
next({ message: 'I don\'t know you, who are you?!', status: 403 });
10+
return false;
11+
}
12+
jwt.verify(token, process.env.APP_SECRET, async (err, decoded) => {
13+
if (err) {
14+
next(err);
15+
return false;
16+
}
17+
const {
18+
id, username, iat, exp,
19+
} = decoded;
20+
if (!username) {
21+
next({ message: 'invalid token', status: 403 });
22+
return false;
23+
}
24+
res.header('x-auth-token-creation', iat);
25+
res.header('x-auth-token-expiry', exp);
26+
res.locals.userId = id;
27+
res.locals.username = username;
28+
next();
29+
return false;
30+
});
31+
return false;
32+
}
33+
34+
module.exports = {
35+
isAuthorized,
36+
};

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "express-ready-server",
3-
"version": "1.1.0",
3+
"version": "1.2.0",
44
"description": "Easy Server to use",
55
"main": "index.js",
66
"scripts": {

0 commit comments

Comments
 (0)