Node JS Project Setup | Express | PostGres SQL

 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

  1. Run server:

    node index.js
    
  2. 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)?

Previous Post Next Post