Chupachar
@Chupachar
front-end dev

Почему не удается записать токен аутентификации в cookie?

У меня имеется клиент такого вида:
//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.
  • Вопрос задан
  • 244 просмотра
Пригласить эксперта
Ответы на вопрос 1
i229194964
@i229194964
Веб разработчик
Браузер по умолчанию запрещает Javascript записывать куки для доменов используйте прокси
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы