Skip to content

Commit 45cade9

Browse files
committed
Add server.js and backend config files for authentication
1 parent 22e52f9 commit 45cade9

7 files changed

Lines changed: 131 additions & 37 deletions

File tree

backend/config/db.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
const mongoose = require('mongoose');
2+
3+
const connectDB = async () => {
4+
try {
5+
await mongoose.connect('mongodb://127.0.0.1:27017/githubTracker', {
6+
useNewUrlParser: true,
7+
useUnifiedTopology: true,
8+
});
9+
console.log('MongoDB connected');
10+
} catch (err) {
11+
console.error(err.message);
12+
process.exit(1);
13+
}
14+
};
15+
16+
module.exports = connectDB;

backend/config/passport.js

Whitespace-only changes.

backend/config/passportConfig.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,25 @@ const passport = require("passport");
22
const LocalStrategy = require('passport-local').Strategy;
33
const User = require("../models/User");
44

5+
// Local strategy for login using email
56
passport.use(
67
new LocalStrategy(
7-
{ usernameField: "email" },
8+
{ usernameField: "email" }, // use email instead of username
89
async (email, password, done) => {
910
try {
10-
const user = await User.findOne( {email} );
11+
const user = await User.findOne({ email });
1112
if (!user) {
12-
return done(null, false, { message: 'Email is invalid '});
13+
return done(null, false, { message: 'Email is invalid' });
1314
}
1415

1516
const isMatch = await user.comparePassword(password);
1617
if (!isMatch) {
1718
return done(null, false, { message: 'Invalid password' });
1819
}
1920

21+
// Return user object
2022
return done(null, {
21-
id : user._id.toString(),
23+
id: user._id.toString(),
2224
username: user.username,
2325
email: user.email
2426
});
@@ -29,7 +31,7 @@ passport.use(
2931
)
3032
);
3133

32-
// Serialize user (store user info in session)
34+
// Serialize user (store user id in session)
3335
passport.serializeUser((user, done) => {
3436
done(null, user.id);
3537
});

backend/routes/auth.js

Lines changed: 34 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,44 @@
1-
const express = require("express");
2-
const passport = require("passport");
3-
const User = require("../models/User");
1+
const express = require('express');
42
const router = express.Router();
3+
const passport = require('passport');
4+
const User = require('../models/User');
5+
6+
// Signup
7+
router.post('/signup', async (req, res) => {
8+
const { username, email, password } = req.body;
9+
try {
10+
const user = new User({ username, email, password });
11+
await user.save();
12+
res.status(201).json({ message: 'User created successfully' });
13+
} catch (err) {
14+
res.status(400).json({ error: err.message });
15+
}
16+
});
517

6-
// Signup route
7-
router.post("/signup", async (req, res) => {
8-
9-
const { username, email, password } = req.body;
10-
11-
try {
12-
const existingUser = await User.findOne( {email} );
13-
14-
if (existingUser)
15-
return res.status(400).json( {message: 'User already exists'} );
18+
// Login
19+
router.post('/login', (req, res, next) => {
20+
passport.authenticate('local', (err, user, info) => {
21+
if (err) return next(err);
22+
if (!user) return res.status(400).json({ message: info.message });
1623

17-
const newUser = new User( {username, email, password} );
18-
await newUser.save();
19-
res.status(201).json( {message: 'User created successfully'} );
20-
} catch (err) {
21-
res.status(500).json({ message: 'Error creating user', error: err.message });
22-
}
24+
req.login(user, (err) => {
25+
if (err) return next(err);
26+
res.json({ message: 'Logged in successfully', user });
27+
});
28+
})(req, res, next);
2329
});
2430

25-
// Login route
26-
router.post("/login", passport.authenticate('local'), (req, res) => {
27-
res.status(200).json( { message: 'Login successful', user: req.user } );
31+
// Logout
32+
router.get('/logout', (req, res) => {
33+
req.logout(() => {
34+
res.json({ message: 'Logged out successfully' });
35+
});
2836
});
2937

30-
// Logout route
31-
router.get("/logout", (req, res) => {
32-
33-
req.logout((err) => {
34-
35-
if (err)
36-
return res.status(500).json({ message: 'Logout failed', error: err.message });
37-
else
38-
res.status(200).json({ message: 'Logged out successfully' });
39-
});
38+
// Protected route (example)
39+
router.get('/profile', (req, res) => {
40+
if (!req.isAuthenticated()) return res.status(401).json({ message: 'Not authenticated' });
41+
res.json({ user: req.user });
4042
});
4143

4244
module.exports = router;

github-tracker-auth/index.js

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
const express = require("express");
2+
const bcrypt = require("bcryptjs");
3+
const jwt = require("jsonwebtoken");
4+
5+
const app = express();
6+
app.use(express.json());
7+
8+
const users = []; // Temporary in-memory storage
9+
10+
// 🔑 Register route
11+
app.post("/register", async (req, res) => {
12+
const { username, password } = req.body;
13+
14+
// check if user exists
15+
const existingUser = users.find(u => u.username === username);
16+
if (existingUser) {
17+
return res.status(400).json({ message: "User already exists" });
18+
}
19+
20+
// hash password
21+
const hashedPassword = await bcrypt.hash(password, 10);
22+
users.push({ username, password: hashedPassword });
23+
res.json({ message: "User registered successfully 🚀" });
24+
});
25+
26+
// 🔑 Login route
27+
app.post("/login", async (req, res) => {
28+
const { username, password } = req.body;
29+
30+
const user = users.find(u => u.username === username);
31+
if (!user) return res.status(400).json({ message: "Invalid credentials" });
32+
33+
const isMatch = await bcrypt.compare(password, user.password);
34+
if (!isMatch) return res.status(400).json({ message: "Invalid credentials" });
35+
36+
// generate token
37+
const token = jwt.sign({ username }, "secretKey123", { expiresIn: "1h" });
38+
res.json({ message: "Login successful 🎉", token });
39+
});
40+
41+
// Protected route
42+
app.get("/profile", (req, res) => {
43+
const authHeader = req.headers["authorization"];
44+
if (!authHeader) return res.status(401).json({ message: "No token provided" });
45+
46+
const token = authHeader.split(" ")[1];
47+
jwt.verify(token, "secretKey123", (err, decoded) => {
48+
if (err) return res.status(403).json({ message: "Invalid token" });
49+
50+
res.json({ message: `Welcome ${decoded.username} 🎉`, user: decoded });
51+
});
52+
});
53+
54+
app.listen(3000, () => console.log("Server is running 🚀"));

github-tracker-auth/package.json

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"name": "github-tracker-auth",
3+
"version": "1.0.0",
4+
"description": "",
5+
"main": "index.js",
6+
"scripts": {
7+
"test": "echo \"Error: no test specified\" && exit 1"
8+
},
9+
"keywords": [],
10+
"author": "",
11+
"license": "ISC",
12+
"dependencies": {
13+
"bcryptjs": "^3.0.2",
14+
"express": "^5.1.0",
15+
"express-session": "^1.18.2",
16+
"passport": "^0.7.0",
17+
"passport-local": "^1.0.0"
18+
}
19+
}

server.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
console.log("Node is working!");

0 commit comments

Comments
 (0)