Skip to content

Commit a355450

Browse files
committed
fixed:cookies
1 parent 017c9fd commit a355450

File tree

4 files changed

+35
-25
lines changed

4 files changed

+35
-25
lines changed

src/controllers/authController.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class AuthController {
1313
body.email,
1414
body.password,
1515
body.name,
16-
body.role
16+
body.role,
1717
);
1818
return res
1919
.status(201)
@@ -35,9 +35,11 @@ class AuthController {
3535
// Set JWT token as HTTP-only cookie
3636
res.cookie("token", result.token, {
3737
httpOnly: true,
38-
secure: true,
39-
sameSite: "strict",
38+
secure: process.env.NODE_ENV === "production",
39+
sameSite: process.env.NODE_ENV === "production" ? "none" : "lax",
4040
maxAge: 24 * 60 * 60 * 1000, // 1 day
41+
domain: process.env.COOKIE_DOMAIN || undefined,
42+
path: "/",
4143
});
4244

4345
return res.status(200).json({ message: "Login successful", ...result });
@@ -59,8 +61,10 @@ class AuthController {
5961
logout = async (req: Request, res: Response) => {
6062
res.clearCookie("token", {
6163
httpOnly: true,
62-
sameSite: "none",
63-
secure: true,
64+
secure: process.env.NODE_ENV === "production",
65+
sameSite: process.env.NODE_ENV === "production" ? "none" : "lax",
66+
domain: process.env.COOKIE_DOMAIN || undefined,
67+
path: "/",
6468
});
6569
return res.status(200).json({ message: "Logout successful" });
6670
};

src/server.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,17 @@ app.use(cookieParser());
1111

1212
// CORS options
1313
const corsOptions = {
14-
origin: [
15-
"https://blog-content-management-demo.vercel.app",
16-
"https://blogcontentmanagement.netlify.app",
17-
], // allow only your frontend
14+
origin: process.env.NODE_ENV === "production"
15+
? [
16+
"https://blog-content-management-demo.vercel.app",
17+
"https://blogcontentmanagement.netlify.app",
18+
process.env.FRONTEND_URL, // Allow custom frontend URL from env
19+
].filter(Boolean) // Remove undefined values
20+
: true, // Allow all origins in development
1821
credentials: true, // allow cookies to be sent
1922
methods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"], // Explicitly allow methods
20-
allowedHeaders: ["Content-Type", "Authorization"], // Allow headers
23+
allowedHeaders: ["Content-Type", "Authorization", "Cookie"], // Allow headers including cookies
24+
optionsSuccessStatus: 200, // For legacy browser support
2125
};
2226

2327
app.use(cors(corsOptions));

src/services/adminServices.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { prisma } from "../config/prisma";
22

33
export class AdminService {
44
async getAllUsers() {
5-
// Fetch only users with role = 'USER'
5+
// Fetch only users with role = 'USER'
66
return prisma.user.findMany({
77
where: { role: "USER" },
88
select: {
@@ -23,7 +23,7 @@ export class AdminService {
2323
throw new Error("User not found");
2424
}
2525

26-
// Prevent admin from deleting other admins
26+
// Prevent admin from deleting other admins
2727
if (user.role === "ADMIN") {
2828
throw new Error("Cannot delete an admin account");
2929
}

src/services/authServices.ts

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,23 @@ import { generateToken } from "../utils/generateTokenJWT";
44
import { Response } from "express";
55

66
export class AuthService {
7-
// 🔹 Register a new user
7+
// Register a new user
88
async register(
99
email: string,
1010
password: string,
1111
name?: string,
12-
role?: "USER" | "ADMIN",
12+
role?: "USER" | "ADMIN"
1313
) {
14-
// 1️⃣ Check if user already exists
14+
// Check if user already exists
1515
const existingUser = await prisma.user.findUnique({ where: { email } });
1616
if (existingUser) {
1717
throw new Error("A user with this email already exists");
1818
}
1919

20-
// 2️⃣ Hash the password
20+
//Hash the password
2121
const hashedPassword = await bcrypt.hash(password, 12);
2222

23-
// 3️⃣ Create new user
23+
//Create new user
2424
const user = await prisma.user.create({
2525
data: {
2626
email,
@@ -30,7 +30,7 @@ export class AuthService {
3030
},
3131
});
3232

33-
// 4️⃣ Generate JWT token
33+
// Generate JWT token
3434
const token = generateToken({
3535
id: user.id,
3636
email: user.email,
@@ -41,17 +41,17 @@ export class AuthService {
4141
return { user, token };
4242
}
4343

44-
// 🔹 Login existing user
44+
// Login existing user
4545
async login(email: string, password: string) {
46-
// 1️⃣ Find user by email
46+
// Find user by email
4747
const user = await prisma.user.findUnique({ where: { email } });
4848
if (!user) throw new Error("User not found");
4949

50-
// 2️⃣ Compare password
50+
// Compare password
5151
const isMatch = await bcrypt.compare(password, user.password);
5252
if (!isMatch) throw new Error("Invalid credentials");
5353

54-
// 3️⃣ Generate token
54+
// Generate token
5555
const token = generateToken({
5656
id: user.id,
5757
email: user.email,
@@ -62,13 +62,15 @@ export class AuthService {
6262
return { user, token };
6363
}
6464

65-
// 🔹 Logout user (clear JWT cookie)
65+
// Logout user (clear JWT cookie)
6666
async logout(res: Response) {
6767
try {
6868
res.clearCookie("token", {
6969
httpOnly: true,
70-
secure: true,
71-
sameSite: "none",
70+
secure: process.env.NODE_ENV === "production",
71+
sameSite: process.env.NODE_ENV === "production" ? "none" : "lax",
72+
domain: process.env.COOKIE_DOMAIN || undefined,
73+
path: "/",
7274
});
7375
return { message: "Logged out successfully" };
7476
} catch {

0 commit comments

Comments
 (0)