I started learning how to use passport today, I’m not quite sure why login fails…
here is the code…
const express = require('express');
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
const hbs = require('hbs');
const morgan = require('morgan');
const session = require('express-session');
const cookieParser = require('cookie-parser');
const MongoStore = require('connect-mongo')(session);
const passport = require('passport');
const passportConfig = require('./passport');
const User = require('./models/user');
const app = express();
const url = '<mongoURI>';
mongoose.connect(url, (err) => {
if (err) {
console.log(err);
} else {
console.log('Connected to mongoose...');
}
});
app.set('view engine', 'hbs');
app.use(morgan('dev'));
app.use(cookieParser());
app.use(bodyParser.json());
app.use(express.static(__dirname + '/public'));
hbs.registerPartials(__dirname + '/views/partials');
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(session({
secret: 'hello',
resave: false,
saveUninitialized: true,
store: new MongoStore({
url,
autoReconnect: true
})
}));
app.use(passport.initialize());
app.use(passport.session());
// home route
app.get('/', (req, res) => {
res.render('home');
});
// login route
app.get('/login', (req, res) => {
if (req.user) return res.redirect('/');
res.render('login');
});
app.post('/login',
passport.authenticate('local', {
successRedirect: '/profile',
failureRedirect: '/login'
})
);
// signup route
app.get('/profile', (req, res) => {
res.render('profile');
});
// logout
app.get('/logout', (req, res) => {
req.logout();
res.redirect('/login');
});
// create user
app.post('/posts', (req, res) => {
let user = User();
user.username = req.body.username;
user.password = req.body.password;
user.save((err) => {
if (err) res.json('Error!!!')
res.json(user);
});
});
// start server
app.listen(3000, (err) => {
if (err) {
console.log('Unable to connect', err);
} else {
console.log('Server running...');
}
});
And the code for passport…
const passport = require('passport');
const User = require('./models/user');
const LocalStrategy = require('passport-local').Strategy;
// store the user._id in the session
passport.serializeUser((user, done) => {
done(null, user._id);
});
// fetch the user._id from database
passport.deserializeUser((id, done) => {
User.findById(id, (err, user) => {
done(err, user);
});
});
// sign in //local-login
passport.use(new LocalStrategy(
(username, password, done) => {
User.findOne({
username: username
}, function(err, user) {
if (err) {
return done(err);
}
if (!user) {
return done(null, false, {
message: 'Incorrect username.'
});
}
if (!user.validPassword(password)) {
return done(null, false, {
message: 'Incorrect password.'
});
}
return done(null, user);
});
}
));