Code
const express = require('express');
const session = require('express-session');
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const bodyParser = require('body-parser');
const app = express();
// Middleware
app.use(bodyParser.urlencoded({ extended: true }));
app.use(session({
secret: 'your-secret-key', // Change this to a secure secret
resave: false,
saveUninitialized: false,
}));
app.use(passport.initialize());
app.use(passport.session());
// User model (example)
const users = []; // In-memory user storage for simplicity
// Configure Passport.js
passport.use(new LocalStrategy(
(username, password, done) => {
const user = users.find(u => u.username === username);
if (!user) return done(null, false, { message: 'Incorrect username.' });
if (user.password !== password) return done(null, false, { message: 'Incorrect password.' });
return done(null, user);
}
));
passport.serializeUser((user, done) => {
done(null, user.username);
});
passport.deserializeUser((username, done) => {
const user = users.find(u => u.username === username);
done(null, user);
});
// Routes
app.get('/', (req, res) => {
res.send('<h1>Welcome</h1><a href="/login">Login</a> | <a href="/register">Register</a>');
});
// Registration Route
app.get('/register', (req, res) => {
res.send(`
<form method="POST" action="/register">
<input type="text" name="username" placeholder="Username" required>
<input type="password" name="password" placeholder="Password" required>
<button type="submit">Register</button>
</form>
`);
});
app.post('/register', (req, res) => {
const { username, password } = req.body;
if (users.find(u => u.username === username)) {
return res.send('User already exists.');
}
users.push({ username, password });
res.redirect('/login');
});
// Login Route
app.get('/login', (req, res) => {
res.send(`
<form method="POST" action="/login">
<input type="text" name="username" placeholder="Username" required>
<input type="password" name="password" placeholder="Password" required>
<button type="submit">Login</button>
</form>
`);
});
app.post('/login', passport.authenticate('local', {
successRedirect: '/protected',
failureRedirect: '/login',
}));
// Protected Route
app.get('/protected', (req, res) => {
if (req.isAuthenticated()) {
res.send(`<h1>Hello ${req.user.username}!</h1><a href="/logout">Logout</a>`);
} else {
res.redirect('/login');
}
});
// Logout Route
app.get('/logout', (req, res) => {
req.logout((err) => {
if (err) return next(err);
res.redirect('/');
});
});
// Start the server
app.listen(3000, () => {
console.log('Server is running on http://localhost:3000');
});
Using mongoose
const express = require('express');
const session = require('express-session');
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
const app = express();
// Connect to MongoDB
mongoose.connect('mongodb://localhost:27017/passport-demo', {
useNewUrlParser: true,
useUnifiedTopology: true,
});
const UserSchema = new mongoose.Schema({
username: { type: String, required: true, unique: true },
password: { type: String, required: true },
});
const User = mongoose.model('User', UserSchema);
// Middleware
app.use(bodyParser.urlencoded({ extended: true }));
app.use(session({
secret: 'your-secret-key', // Change to a secure secret
resave: false,
saveUninitialized: false,
}));
app.use(passport.initialize());
app.use(passport.session());
// Passport Configuration
passport.use(new LocalStrategy(
(username, password, done) => {
User.findOne({ username }, (err, user) => {
if (err) return done(err);
if (!user) return done(null, false, { message: 'Incorrect username.' });
if (user.password !== password) return done(null, false, { message: 'Incorrect password.' });
return done(null, user);
});
}
));
passport.serializeUser((user, done) => {
done(null, user.id);
});
passport.deserializeUser((id, done) => {
User.findById(id, (err, user) => {
done(err, user);
});
});
// Routes
app.get('/', (req, res) => {
res.send('<h1>Welcome</h1><a href="/login">Login</a> | <a href="/register">Register</a>');
});
// Registration Route
app.get('/register', (req, res) => {
res.send(`
<form method="POST" action="/register">
<input type="text" name="username" placeholder="Username" required>
<input type="password" name="password" placeholder="Password" required>
<button type="submit">Register</button>
</form>
`);
});
app.post('/register', (req, res) => {
const { username, password } = req.body;
const newUser = new User({ username, password });
newUser.save(err => {
if (err) {
return res.send('User already exists or an error occurred.');
}
res.redirect('/login');
});
});
// Login Route
app.get('/login', (req, res) => {
res.send(`
<form method="POST" action="/login">
<input type="text" name="username" placeholder="Username" required>
<input type="password" name="password" placeholder="Password" required>
<button type="submit">Login</button>
</form>
`);
});
app.post('/login', passport.authenticate('local', {
successRedirect: '/protected',
failureRedirect: '/login',
}));
// Protected Route
app.get('/protected', (req, res) => {
if (req.isAuthenticated()) {
res.send(`Hello ${req.user.username}! <a href="/logout">Logout</a>`);
} else {
res.redirect('/login');
}
});
// Logout Route
app.get('/logout', (req, res) => {
req.logout((err) => {
if (err) return next(err);
res.redirect('/');
});
});
// Start the server
app.listen(3000, () => {
console.log('Server is running on http://localhost:3000');
});
Google authentication
npm install express express-session passport passport-google-oauth20 mongoose body-parser
const express = require('express');
const session = require('express-session');
const passport = require('passport');
const GoogleStrategy = require('passport-google-oauth20').Strategy;
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
const app = express();
// Connect to MongoDB
mongoose.connect('mongodb://localhost:27017/passport-demo', {
useNewUrlParser: true,
useUnifiedTopology: true,
});
const UserSchema = new mongoose.Schema({
googleId: { type: String, required: true, unique: true },
username: String,
thumbnail: String,
});
const User = mongoose.model('User', UserSchema);
// Middleware
app.use(bodyParser.urlencoded({ extended: true }));
app.use(session({
secret: 'your-secret-key', // Change to a secure secret
resave: false,
saveUninitialized: false,
}));
app.use(passport.initialize());
app.use(passport.session());
// Passport Configuration
passport.use(new GoogleStrategy({
clientID: 'YOUR_GOOGLE_CLIENT_ID', // Replace with your client ID
clientSecret: 'YOUR_GOOGLE_CLIENT_SECRET', // Replace with your client secret
callbackURL: '/auth/google/callback',
},
async (accessToken, refreshToken, profile, done) => {
try {
const existingUser = await User.findOne({ googleId: profile.id });
if (existingUser) {
return done(null, existingUser);
}
const newUser = await new User({
googleId: profile.id,
username: profile.displayName,
thumbnail: profile._json.picture,
}).save();
done(null, newUser);
} catch (err) {
done(err, null);
}
}));
passport.serializeUser((user, done) => {
done(null, user.id);
});
passport.deserializeUser((id, done) => {
User.findById(id, (err, user) => {
done(err, user);
});
});
// Routes
app.get('/', (req, res) => {
res.send('<h1>Welcome</h1><a href="/auth/google">Login with Google</a>');
});
app.get('/auth/google', passport.authenticate('google', {
scope: ['profile', 'email'],
}));
app.get('/auth/google/callback',
passport.authenticate('google', {
failureRedirect: '/login',
successRedirect: '/protected',
}));
app.get('/protected', (req, res) => {
if (req.isAuthenticated()) {
res.send(`Hello ${req.user.username}! <img src="${req.user.thumbnail}" /><a
href="/logout">Logout</a>`);
} else {
res.redirect('/');
}
});
app.get('/logout', (req, res) => {
req.logout((err) => {
if (err) return next(err);
res.redirect('/');
});
});
// Start the server
app.listen(3000, () => {
console.log('Server is running on http://localhost:3000');
});