Recently i have deployed both node/express api and client(Nextjs 14.1.0) to vercel everything works fine except cookies. In some cases i am getting cookies but they are just temporary when i refresh the page everything gone and other cases i am getting this warning(below) about the domain.
“The attempt to set a cookie via a Set-Cookie was blocked because its domain attribute was invalid”
Even i set domain in cookies like below but still no success
res.cookie("refreshToken", refreshToken, {
maxAge: 15 * 24 * 60 * 60 * 1000,
sameSite: "none",
httpOnly: true,
secure: true,
partitioned: true,
domain: ".mern-nextjs-ecommerce.vercel.app"
});
res.cookie("accessToken", accessToken, {
maxAge: 15 * 24 * 60 * 60 * 1000,
sameSite: "none",
httpOnly: true,
secure: true,
partitioned: true,
domain: ".mern-nextjs-ecommerce.vercel.app"
});
Signin Code
export const signIn = TryCatch(async (req, res, next) => {
const { email, password } = req.body;
const user = await User.findOne({ email });
if (!user) return next(new ErrorHandler("Invalid credentials", 400));
const isMatched = await user.comparePassword(password);
if (!isMatched) return next(new ErrorHandler("Invalid credentials", 400));
const accessToken = jwt.sign({ id: user._id }, config.JWT_SECRET, {
expiresIn: "45m",
});
const refreshToken = jwt.sign({ id: user._id }, config.JWT_SECRET);
if (!user.tokens) user.tokens = [refreshToken];
else user.tokens.push(refreshToken);
await user.save();
res.cookie("refreshToken", refreshToken, {
maxAge: 15 * 24 * 60 * 60 * 1000,
sameSite: "none",
httpOnly: true,
secure: true,
partitioned: true,
});
res.cookie("accessToken", accessToken, {
maxAge: 15 * 24 * 60 * 60 * 1000,
sameSite: "none",
httpOnly: true,
secure: true,
partitioned: true,
});
res.json({
success: true,
profile: {
id: user._id,
email: user.email,
name: user.username,
verified: user.verified,
avatar: user.avatar?.url,
accessToken: accessToken,
},
accessToken,
refreshToken,
});
});
Cors Config
app.use(
cors({
origin: [
"https://mern-nextjs-ecommerce.vercel.app",
config.ADMIN_CLIENT_URL,
"http://localhost:3000",
],
credentials: true,
methods: ["GET", "POST", "PUT", "DELETE"],
allowedHeaders: [
"Content-Type",
"Authorization",
"Origin",
"X-Requested-With",
"Accept",
"Set-Cookie",
"Cookie",
],
})
);
Frontend Submit Function
const handleSignInSubmit = async (data: SignInInput) => {
try {
const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}auth/signin`, {
method: "POST",
credentials: "include", // This ensures cookies are sent with the request
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
email: data.email,
password: data.password,
}),
});
const resData = await res.json();
toast.success(resData.message || "Logged In !");
} catch (error) {
toast.error("An error occurred");
}
};