Skip to content

Commit fd6d01e

Browse files
Krishna KantKrishna Kant
Krishna Kant
authored and
Krishna Kant
committed
Using API and JWT Authentication
1 parent 3c7ce1e commit fd6d01e

11 files changed

+219
-0
lines changed

config/passport-jwt-strategy.js

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
const passport = require('passport');
2+
const JWTStrategy = require('passport-jwt').Strategy;
3+
const ExtractJWT = require('passport-jwt').ExtractJwt;
4+
5+
const User = require('../models/user');
6+
7+
let opts = {
8+
jwtFromRequest: ExtractJWT.fromAuthHeaderAsBearerToken(),
9+
secretOrKey: 'laterChange'
10+
}
11+
12+
passport.use(new JWTStrategy(opts, async function(jwtPayLoad, done){
13+
try {
14+
const user = await User.findById(jwtPayLoad._id);
15+
// console.log(user);
16+
if(user){
17+
return done(null, user);
18+
} else {
19+
return done(null, false);
20+
}
21+
22+
} catch (err) {
23+
console.log('Error in FInding user from JWT Strategy', err);
24+
return;
25+
}
26+
}));
27+
28+
29+
module.exports = passport;

controllers/api/v1/posts_api.js

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
const Post = require('../../../models/post');
2+
const Comment = require('../../../models/comment');
3+
4+
module.exports.index = async function(req, res) {
5+
6+
let posts = await Post.find({})
7+
.sort('_createdAt')
8+
.populate('user')
9+
.populate({
10+
path: 'comments',
11+
populate: {
12+
path: 'user'
13+
}
14+
});
15+
16+
return res.json(200, {
17+
message : "Lists of Posts",
18+
posts: posts
19+
})
20+
}
21+
22+
23+
module.exports.destroy = async function(req, res) {
24+
try {
25+
let post = await Post.findById(req.params.id);
26+
27+
if(post.user == req.user.id) {
28+
post.deleteOne();
29+
30+
await Comment.deleteMany({post: req.params.id});
31+
32+
return res.json(200, {
33+
message: 'Post and associated comments Deleted Successfully'
34+
});
35+
} else {
36+
return res.json(401, {
37+
message: "You cannot delete this post!"
38+
});
39+
}
40+
} catch (err) {
41+
console.log('********', err);
42+
return res.json(500, {
43+
message: "Internal Server Error"
44+
});
45+
}
46+
}

controllers/api/v1/users_api.js

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
const User = require('../../../models/user');
2+
const jwt = require('jsonwebtoken');
3+
4+
module.exports.createSession = async function(req, res) {
5+
try {
6+
let user = await User.findOne({email: req.body.email});
7+
8+
if(!user || user.password != req.body.password) {
9+
return res.json(422, {
10+
message: "Invalid Username or Password"
11+
});
12+
}
13+
14+
return res.json(200, {
15+
message: 'Sign in successful, please safe your Token!',
16+
data: {
17+
token : jwt.sign(user.toJSON(), 'laterChange', {expiresIn : '100000'})
18+
}
19+
})
20+
} catch (err) {
21+
console.log('-----', err);
22+
return res.json(500, {
23+
message: "Internal Server Error"
24+
});
25+
}
26+
}

index.js

+3
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,11 @@ const app = express();
77
const db = require("./config/mongoose");
88
// Used for Session Cookies
99
const session = require("express-session");
10+
11+
// Using Passport js Strategy
1012
const passport = require("passport");
1113
const passportLocal = require("./config/passport-local-strategy");
14+
const passportJWT = require('./config/passport-jwt-strategy');
1215
const MongoStore = require("connect-mongo");
1316
const sassMiddleware = require("node-sass-middleware");
1417
const flash = require('connect-flash');

package-lock.json

+77
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+2
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,13 @@
1818
"express": "^4.18.2",
1919
"express-ejs-layouts": "^2.5.1",
2020
"express-session": "^1.17.3",
21+
"jsonwebtoken": "^9.0.1",
2122
"mongoose": "^7.3.1",
2223
"multer": "^1.4.5-lts.1",
2324
"node-sass-middleware": "^1.0.1",
2425
"nodemon": "^2.0.22",
2526
"passport": "^0.6.0",
27+
"passport-jwt": "^4.0.1",
2628
"passport-local": "^1.0.0"
2729
}
2830
}

routes/api/index.js

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
const express = require('express');
2+
3+
const router = express.Router();
4+
5+
router.use('/v1', require('./v1'));
6+
7+
module.exports = router;

routes/api/v1/index.js

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
const express = require('express');
2+
3+
const router = express.Router();
4+
5+
router.use('/posts', require('./posts'));
6+
router.use('/users', require('./users'));
7+
8+
module.exports = router;

routes/api/v1/posts.js

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
const express = require('express');
2+
3+
const router = express.Router();
4+
const passport = require('passport');
5+
const postsAPI = require('../../../controllers/api/v1/posts_api');
6+
7+
8+
router.get('/', postsAPI.index);
9+
router.delete('/:id', passport.authenticate('jwt', {session: false}), postsAPI.destroy);
10+
11+
module.exports = router;

routes/api/v1/users.js

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
const express = require('express');
2+
3+
const router = express.Router();
4+
const userAPI = require('../../../controllers/api/v1/users_api');
5+
6+
router.post('/create-session', userAPI.createSession);
7+
8+
module.exports = router;

routes/index.js

+2
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,7 @@ router.use('/users', require('./users'));
99
router.use('/posts', require('./posts'));
1010
router.use('/comments', require('./comments'));
1111

12+
router.use('/api', require('./api'));
13+
1214

1315
module.exports = router;

0 commit comments

Comments
 (0)