├── .gitignore ├── Procfile ├── .vscode └── settings.json ├── config ├── dbconfig.js ├── db.js └── passport.js ├── README.md ├── routes └── index.js ├── server.js ├── package.json ├── models └── user.js └── methods └── actions.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: node server -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.fontSize": 20, 3 | "window.zoomLevel": 1 4 | } -------------------------------------------------------------------------------- /config/dbconfig.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | secret: 'yoursecret', 3 | database: 'yourdburlhere' 4 | } 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Flutter Authentication - MongoDB, Express, Nodejs 2 | 3 | Code for the video - https://youtu.be/2D_76lkyF1c 4 | 5 | To use this project, kindly change the dburl in the config/dbconfig.js file. (Pls watch video for better clarity) 6 | -------------------------------------------------------------------------------- /config/db.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose') 2 | const dbConfig = require('./dbconfig') 3 | 4 | const connectDB = async() => { 5 | try { 6 | const conn = await mongoose.connect(dbConfig.database, { 7 | useNewUrlParser: true, 8 | useUnifiedTopology: true, 9 | useFindAndModify: false 10 | }) 11 | console.log(`MongoDB Connected: ${conn.connection.host}`) 12 | } 13 | catch (err) { 14 | console.log(err) 15 | process.exit(1) 16 | } 17 | } 18 | 19 | module.exports = connectDB -------------------------------------------------------------------------------- /routes/index.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const actions = require('../methods/actions') 3 | const router = express.Router() 4 | 5 | router.get('/', (req, res) => { 6 | res.send('Hello World') 7 | }) 8 | 9 | router.get('/dashboard', (req, res) => { 10 | res.send('Dashboard') 11 | }) 12 | 13 | //@desc Adding new user 14 | //@route POST /adduser 15 | router.post('/adduser', actions.addNew) 16 | 17 | //@desc Authenticate a user 18 | //@route POST /authenticate 19 | router.post('/authenticate', actions.authenticate) 20 | 21 | //@desc Get info on a user 22 | //@route GET /getinfo 23 | router.get('/getinfo', actions.getinfo) 24 | 25 | module.exports = router -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const morgan = require('morgan') 3 | const cors = require('cors') 4 | const connectDB = require('./config/db') 5 | const passport = require('passport') 6 | const bodyParser = require('body-parser') 7 | const routes = require('./routes/index') 8 | 9 | connectDB() 10 | 11 | const app = express() 12 | 13 | if (process.env.NODE_ENV === 'development') { 14 | app.use(morgan('dev')) 15 | } 16 | 17 | app.use(cors()) 18 | app.use(bodyParser.urlencoded({ extended: false })) 19 | app.use(bodyParser.json()) 20 | app.use(routes) 21 | app.use(passport.initialize()) 22 | require('./config/passport')(passport) 23 | 24 | 25 | const PORT = process.env.PORT || 3000 26 | 27 | app.listen(PORT, console.log(`Server running in ${process.env.NODE_ENV} mode on port ${PORT}`)) -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "flutterauth", 3 | "version": "1.0.0", 4 | "description": "Authentication system for flutter apps", 5 | "main": "server.js", 6 | "scripts": { 7 | "start": "cross-env NODE_ENV=production node server", 8 | "dev": "cross-env NODE_ENV=development nodemon server" 9 | }, 10 | "author": "Rajayogan", 11 | "license": "MIT", 12 | "dependencies": { 13 | "bcrypt": "^5.0.0", 14 | "body-parser": "^1.19.0", 15 | "connect-mongo": "^3.2.0", 16 | "cors": "^2.8.5", 17 | "cross-env": "^7.0.2", 18 | "dotenv": "^8.2.0", 19 | "express": "^4.17.1", 20 | "jwt-simple": "^0.5.6", 21 | "mongoose": "^5.9.20", 22 | "morgan": "^1.10.0", 23 | "nodemon": "^2.0.4", 24 | "passport": "^0.4.1", 25 | "passport-jwt": "^4.0.0" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /config/passport.js: -------------------------------------------------------------------------------- 1 | var JwtStrategy = require('passport-jwt').Strategy 2 | var ExtractJwt = require('passport-jwt').ExtractJwt 3 | 4 | var User = require('../models/user') 5 | var config = require('./dbconfig') 6 | 7 | module.exports = function (passport) { 8 | var opts = {} 9 | 10 | opts.secretOrKey = config.secret 11 | opts.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme('jwt') 12 | 13 | passport.use(new JwtStrategy(opts, function (jwt_payload, done) { 14 | User.find({ 15 | id: jwt_payload.id 16 | }, function (err, user) { 17 | if (err) { 18 | return done(err, false) 19 | } 20 | if (user) { 21 | return done(null, user) 22 | } 23 | 24 | else { 25 | return done(null, false) 26 | } 27 | } 28 | ) 29 | })) 30 | } -------------------------------------------------------------------------------- /models/user.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('mongoose') 2 | var Schema = mongoose.Schema; 3 | var bcrypt = require('bcrypt') 4 | var userSchema = new Schema({ 5 | name: { 6 | type: String, 7 | require: true 8 | }, 9 | password: { 10 | type: String, 11 | require: true 12 | } 13 | }) 14 | 15 | userSchema.pre('save', function (next) { 16 | var user = this; 17 | if (this.isModified('password') || this.isNew) { 18 | bcrypt.genSalt(10, function (err, salt) { 19 | if (err) { 20 | return next(err) 21 | } 22 | bcrypt.hash(user.password, salt, function (err, hash) { 23 | if (err) { 24 | return next(err) 25 | } 26 | user.password = hash; 27 | next() 28 | }) 29 | }) 30 | } 31 | else { 32 | return next() 33 | } 34 | }) 35 | 36 | userSchema.methods.comparePassword = function (passw, cb) { 37 | bcrypt.compare(passw, this.password, function (err, isMatch) { 38 | if(err) { 39 | return cb(err) 40 | } 41 | cb(null, isMatch) 42 | }) 43 | } 44 | 45 | module.exports = mongoose.model('User', userSchema) -------------------------------------------------------------------------------- /methods/actions.js: -------------------------------------------------------------------------------- 1 | var User = require('../models/user') 2 | var jwt = require('jwt-simple') 3 | var config = require('../config/dbconfig') 4 | 5 | var functions = { 6 | addNew: function (req, res) { 7 | if ((!req.body.name) || (!req.body.password)) { 8 | res.json({success: false, msg: 'Enter all fields'}) 9 | } 10 | else { 11 | var newUser = User({ 12 | name: req.body.name, 13 | password: req.body.password 14 | }); 15 | newUser.save(function (err, newUser) { 16 | if (err) { 17 | res.json({success: false, msg: 'Failed to save'}) 18 | } 19 | else { 20 | res.json({success: true, msg: 'Successfully saved'}) 21 | } 22 | }) 23 | } 24 | }, 25 | authenticate: function (req, res) { 26 | User.findOne({ 27 | name: req.body.name 28 | }, function (err, user) { 29 | if (err) throw err 30 | if (!user) { 31 | res.status(403).send({success: false, msg: 'Authentication Failed, User not found'}) 32 | } 33 | 34 | else { 35 | user.comparePassword(req.body.password, function (err, isMatch) { 36 | if (isMatch && !err) { 37 | var token = jwt.encode(user, config.secret) 38 | res.json({success: true, token: token}) 39 | } 40 | else { 41 | return res.status(403).send({success: false, msg: 'Authentication failed, wrong password'}) 42 | } 43 | }) 44 | } 45 | } 46 | ) 47 | }, 48 | getinfo: function (req, res) { 49 | if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') { 50 | var token = req.headers.authorization.split(' ')[1] 51 | var decodedtoken = jwt.decode(token, config.secret) 52 | return res.json({success: true, msg: 'Hello ' + decodedtoken.name}) 53 | } 54 | else { 55 | return res.json({success: false, msg: 'No Headers'}) 56 | } 57 | } 58 | } 59 | 60 | module.exports = functions --------------------------------------------------------------------------------