#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
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
и это сработало, как и ожидалось