Файлы cookie нулевые с внешнего интерфейса, но видны в postman

#node.js #reactjs #session

Вопрос:

Здравствуйте, я практикую аутентификацию jwt с помощью react js и node js

всякий раз, когда пользователь входит в систему, токен jwt устанавливается в файлах cookie следующим образом

Я просто сопоставляю только электронную почту, а не пароль, в настоящее время сосредоточен на поддержании сеансов

 exports.login = async(req,res)=gt;{    const u = await User.findOne({  where:{  email:{  [Op.eq]:req.body.email  }  }  }) if(u!=null) {    const token = jwt.sign({_id: u.id}, process.env.JWT_SECRET)     const cookie = req.cookies.token; console.log("I am cookies",cookie) //shows token in postman but null when logged in from react frontend if (cookie == undefined){   res.cookie('token', token, {httpOnly: true});   }  return res.status(200).json({"status":200,message:"login success"});  }else {  res.json({"status":400,"message":"Login Failed"}) }  }  

Мой метод проверки токена

 exports.checkToken =async(req,res)=gt; {    console.log("DATA ONE: ", req.cookies.token)  const req_token = req.cookies.token  let auth = false;  if(!req_token)  {  return res.json({"message":"Login Again"})  }  try{  if(!jwt.verify(req_token,process.env.JWT_SECRET))throw 'token not valid';  else{  auth =true;    }    }catch(err)  {  console.log("Invalid TOken")  }   if(!auth)  {  return res.json(400).json({"message":"token verification failed"})  }else  {  const data = jwt.verify(req_token,process.env.JWT_SECRET)  console.log(data)  User.findOne({  where:{  id:{  [Op.eq]:data._id}}}).then((user)=gt;{    if(!user)  {  return res.status(400).json({"error":"user not found"})  }  const {id,email}=user  return res.status(200).json({user:{id,email}})  })      } }  

i am using cookie-parser and have positioned it before my routes such that no conflict of order occur

my server.js file

 const express = require('express'); const sequelize = require('./config/connection'); const bodyParser = require('body-parser')  var cors = require("cors");   var cookieParser = require("cookie-parser"); var app = express(); app.use(cookieParser()) app.use(bodyParser.json()) app.use(bodyParser.urlencoded({ extended: true })) app.use(cors())  app.use('/students',students) sequelize.sync(); app.listen(port,(err,res)=gt;{   console.log(`connected on port number:${port}`) })  

and in my routes file I am hitting my methods as follows

 const express = require('express'); const app = express(); const router = express.Router(); const Authcontroller = require('../controllers/Authcontroller') router.get("/verifyToken",Authcontroller.checkToken) router.post("/login",Authcontroller.login)  

so for testing when I hit routes to check my login functionality and verify auth token both things work and return cookies as can be seen in images VERIFYING TOKEN Login

Lastly, This is my frontEnd login function and on useEffect I am checking for the token if valid or not

 const isAuthenticated = ()=gt; {    axios.get("http://localhost:3855/students/verifyToken").then((res)=gt;{ console.log(res)  setUser(res.data.user)   }) }  React.useEffect(()=gt;{  isAuthenticated() },[])  

и моя функция входа в систему

 const login = () =gt; {  var options = {  email:userEmail  }  axios.post("http://localhost:3855/students/login",options).then((res)=gt;{    if(res.data.status == 200)  {  console.log("redirect to home ")  }else  {  console.log("redirect to login ")  }  }).catch((err)=gt;{  console.log(err)  })        }  

Я правильно устанавливаю токен при попытке с почтальона и с интерфейса react, но когда я его получаю, я получаю его только в почтальоне, а не в интерфейсе react.

Я пытался сделать это инкогнито и в разных браузерах, но безуспешно

Ответ, который я получаю в приложении react, таков

 { message: "Login Again" }  

Ответ №1:

РЕШЕНО: используя прокси в моем интерфейсном приложении, которое направлено на серверную часть, я добавил «прокси»:»http://localhost:3085″

после этого я удалил файл package-lock.json моего внешнего приложения вместе с node_modules, а затем установил npm install после этого, когда я нажал url для бэкенда, был создан прокси, скрывающий мой внутренний URL, показывая внешний URL http://localhost:3855/students/login было показано, как http://localhost:3000/students/login

и это сработало, как и ожидалось