Got it 👍 Let’s do authentication in Node.js using Passport.js with PostgreSQL.
This setup will give you:
-
Register user (store in Postgres with hashed password)
-
Login with Passport local strategy
-
JWT authentication with Passport-JWT
📝 Step-by-Step Setup
1. Install Dependencies
npm init -y
npm install express passport passport-local passport-jwt bcryptjs pg sequelize jsonwebtoken dotenv cors
2. Project Structure
project/
│── index.js
│── db.js
│── models/User.js
│── config/passport.js
│── routes/authRoutes.js
│── .env
3. Database Config (db.js
)
const { Sequelize } = require("sequelize");
const sequelize = new Sequelize(
process.env.DB_NAME,
process.env.DB_USER,
process.env.DB_PASS,
{
host: process.env.DB_HOST,
dialect: "postgres",
}
);
sequelize.authenticate()
.then(() => console.log("Postgres Connected"))
.catch(err => console.error("DB Error:", err));
module.exports = sequelize;
4. User Model (models/User.js
)
const { DataTypes } = require("sequelize");
const sequelize = require("../db");
const User = sequelize.define("User", {
name: { type: DataTypes.STRING, allowNull: false },
email: { type: DataTypes.STRING, unique: true, allowNull: false },
password: { type: DataTypes.STRING, allowNull: false }
});
sequelize.sync();
module.exports = User;
5. Passport Config (config/passport.js
)
const { Strategy: LocalStrategy } = require("passport-local");
const { Strategy: JwtStrategy, ExtractJwt } = require("passport-jwt");
const bcrypt = require("bcryptjs");
const User = require("../models/User");
module.exports = (passport) => {
// Local Strategy (Login)
passport.use(
new LocalStrategy({ usernameField: "email" }, async (email, password, done) => {
try {
const user = await User.findOne({ where: { email } });
if (!user) return done(null, false, { message: "User not found" });
const isMatch = await bcrypt.compare(password, user.password);
if (!isMatch) return done(null, false, { message: "Wrong password" });
return done(null, user);
} catch (err) {
return done(err);
}
})
);
// JWT Strategy
passport.use(
new JwtStrategy(
{
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey: process.env.JWT_SECRET,
},
async (jwtPayload, done) => {
try {
const user = await User.findByPk(jwtPayload.id);
if (user) return done(null, user);
return done(null, false);
} catch (err) {
return done(err, false);
}
}
)
);
};
6. Auth Routes (routes/authRoutes.js
)
const express = require("express");
const bcrypt = require("bcryptjs");
const jwt = require("jsonwebtoken");
const passport = require("passport");
const User = require("../models/User");
const router = express.Router();
// Register
router.post("/register", async (req, res) => {
try {
const { name, email, password } = req.body;
const hashed = await bcrypt.hash(password, 10);
const user = await User.create({ name, email, password: hashed });
res.json(user);
} catch (err) {
res.status(400).json({ message: err.message });
}
});
// Login with Passport Local
router.post("/login", (req, res, next) => {
passport.authenticate("local", { session: false }, (err, user, info) => {
if (err || !user) {
return res.status(400).json({ message: info ? info.message : "Login failed" });
}
const token = jwt.sign({ id: user.id }, process.env.JWT_SECRET, { expiresIn: "1h" });
res.json({ token });
})(req, res, next);
});
// Protected Route with JWT
router.get("/profile", passport.authenticate("jwt", { session: false }), (req, res) => {
res.json({ id: req.user.id, name: req.user.name, email: req.user.email });
});
module.exports = router;
7. Main Server (index.js
)
const express = require("express");
const cors = require("cors");
const dotenv = require("dotenv");
const passport = require("passport");
dotenv.config();
const app = express();
app.use(cors());
app.use(express.json());
app.use(passport.initialize());
// Passport config
require("./config/passport")(passport);
// Routes
app.use("/api", require("./routes/authRoutes"));
app.listen(3000, () => console.log("Server running on port 3000"));
8. .env
File
DB_NAME=userdb
DB_USER=postgres
DB_PASS=yourpassword
DB_HOST=localhost
JWT_SECRET=supersecretkey
🚀 How to Test
-
Run server:
node index.js
-
Use Postman:
-
POST /api/register
→ create user -
POST /api/login
→ get JWT token -
GET /api/profile
with header:Authorization: Bearer <token>
-
✅ This gives you Passport.js + JWT + PostgreSQL authentication (production-ready structure).
✅ Covers local login & JWT strategy.
Do you also want me to show you how to add Google/GitHub OAuth with Passport (in case company asks for social login)?
Tags
Node js