У меня имеется клиент такого вида:
//store для компонента формы логина
const login = ref('');
const password = ref('');
const isAuthenticated = ref(false);
const respAuthMessage = ref(null);
const updateAuthentication = (token) => { // если токен приходит, то меняю тип на boolean
isAuthenticated.value = !!token;
}
const handleSubmit = async () => {
const loginData = {
login: login.value,
password: password.value
}
try {
const resp = await loginUser(loginData);
const token = resp.token;
respAuthMessage.value = resp;
updateAuthentication(token);
if (isAuthenticated.value) {
router.push('/');
}
} catch (error) {
console.error('Error:', error);
}
}
//api.js
const getData = async (response) => {
const data = await response.json();
return data;
}
async function fetchData(endpoint, requestData) {
const requestOptions = {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(requestData),
};
const response = await fetch(`http://localhost:5000/auth/${endpoint}`, requestOptions);
return getData(response)
}
export async function loginUser(loginData) {
return fetchData('Login', loginData);
}
так же сервер:
//index.js
import express from "express";
import mongoose from "mongoose";
import authRouter from "./authRouter.js";
import cors from 'cors';
import cookieParser from 'cookie-parser';
const PORT = process.env.PORT || 5000;
const app = express();
app.use(express.json());
app.use(cors());
app.use(cookieParser());
app.use("/auth", authRouter);
const DB_URL = ...;
const start = async () => {
try {
await mongoose.connect(DB_URL);
app.listen(PORT, () => {
console.log(`${PORT}`);
});
} catch(e) {
console.log(e);
}
}
start();
//authController.js
import bcrypt from 'bcryptjs';
import jwt from 'jsonwebtoken';
import { secret } from '../config.js'
const generateAccessToken = (id, roles) => {
const payload = {
id,
roles,
}
return jwt.sign(payload, secret, { expiresIn: "24h" })
}
class authController {
async login(req, res) {
try {
const { login, password } = req.body
const user = await User.findOne({ login })
if(!user) {
return res.status(400).json({ message: `User ${ login } not found` })
}
const validPassword = bcrypt.compareSync(password, user.password)
if(!validPassword) {
return res.status(400).json({ message: `Incorrect password entered` })
}
const token = generateAccessToken(user._id, user.roles)
res.cookie('token', token, { httpOnly: true, maxAge: 3600000 });// не записывает в cookie
return res.json({ token })
}
catch(e) {
console.log(e)
res.status(400).json({message: 'Login error'})
}
}
}
По факту, всё работает хорошо. После регистрации, при логине, я получаю токен, но чего-то он не записывается в cookie. Даже в заголовке ответов в вкладке network я вижу тот самый токен:
Set-Cookie: token=....
Сайт находится на порту 5173, а сервер на 5000. Для корректной работы я использовал cors.