Node.js 在刷新节点上丢失会话
我正在学习Udemy的教程,并使用node和express创建一个react应用程序。我正在丢失会话并在刷新时被发送回登录页面。讲师应用程序在刷新时保持会话状态。路由错误是否会导致此问题?我将从路由文件夹中提供auth.js文件。如果需要,我可以添加更多 > > 以防万一,这是路由文件夹中的auth.js文件Node.js 在刷新节点上丢失会话,node.js,reactjs,express,Node.js,Reactjs,Express,我正在学习Udemy的教程,并使用node和express创建一个react应用程序。我正在丢失会话并在刷新时被发送回登录页面。讲师应用程序在刷新时保持会话状态。路由错误是否会导致此问题?我将从路由文件夹中提供auth.js文件。如果需要,我可以添加更多 > > 以防万一,这是路由文件夹中的auth.js文件 const express = require('express'); const router = express.Router(); const bcrypt = require('b
const express = require('express');
const router = express.Router();
const bcrypt = require('bcryptjs');
const auth = require('../../middleware/auth');
const jwt = require('jsonwebtoken');
const config = require('config');
const { check, validationResult } = require('express-validator');
const User = require('../../models/User');
// @route GET api/auth
// @desc Test route
// @access Public
router.get('/', auth, async (req, res) => {
try {
const user = await User.findById(req.user.id).select('-password');
res.json(user);
} catch (err) {
console.error(err.message);
res.status(500).send('Server Error');
}
});
// @route POST api/auth
// @desc Authenticate user & get token
// @access Public
router.post(
'/',
[
check('email', 'Please include a valid email').isEmail(),
check('password', 'Password is required').exists()
],
async (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
const { email, password } = req.body;
try {
let user = await User.findOne({ email });
if (!user) {
return res
.status(400)
.json({ errors: [{ msg: 'Invalid Credentials' }] });
}
const isMatch = await bcrypt.compare(password, user.password);
if (!isMatch) {
return res
.status(400)
.json({ errors: [{ msg: 'Invalid Credentials' }] });
}
const payload = {
user: {
id: user.id
}
};
jwt.sign(
payload,
config.get('jwtSecret'),
{ expiresIn: 360000 },
(err, token) => {
if (err) throw err;
res.json({ token });
}
);
} catch (err) {
console.error(err.message);
res.status(500).send('Server error');
}
}
);
module.exports = router;
为auth显示的代码只返回一个令牌。该令牌必须与头
x-auth-token
中的任何未来请求一起发送回,以使您的身份验证生效。这种情况不会发生在浏览器页面上(从您提到“刷新”开始,您就一直在使用这个页面)。此特定技术需要将令牌放入cookie中(浏览器将在每次请求时发回cookie),并在其中检查它以验证身份验证,或者此代码仅用于编程访问,而不用于浏览器访问。我不确定您的任务实际上是什么,以了解您试图完成什么。您为auth显示的代码只返回一个令牌。该令牌必须与头x-auth-token
中的任何未来请求一起发送回,以使您的身份验证生效。这种情况不会发生在浏览器页面上(从您提到“刷新”开始,您就一直在使用这个页面)。此特定技术需要将令牌放入cookie中(浏览器将在每次请求时发回cookie),并在其中检查它以验证身份验证,或者此代码仅用于编程访问,而不用于浏览器访问。我不确定你的任务到底是什么,你想完成什么。
const jwt = require('jsonwebtoken');
const config = require('config');
module.exports = function(req, res, next) {
// Get token from header
const token = req.header('x-auth-token');
// Check if not token
if (!token) {
return res.status(401).json({ msg: 'No token, authorization denied' });
}
// Verify token
try {
const decoded = jwt.verify(token, config.get('jwtSecret'));
req.user = decoded.user;
next();
} catch (err) {
res.status(401).json({ msg: 'Token is not valid' });
}
};
const express = require('express');
const router = express.Router();
const bcrypt = require('bcryptjs');
const auth = require('../../middleware/auth');
const jwt = require('jsonwebtoken');
const config = require('config');
const { check, validationResult } = require('express-validator');
const User = require('../../models/User');
// @route GET api/auth
// @desc Test route
// @access Public
router.get('/', auth, async (req, res) => {
try {
const user = await User.findById(req.user.id).select('-password');
res.json(user);
} catch (err) {
console.error(err.message);
res.status(500).send('Server Error');
}
});
// @route POST api/auth
// @desc Authenticate user & get token
// @access Public
router.post(
'/',
[
check('email', 'Please include a valid email').isEmail(),
check('password', 'Password is required').exists()
],
async (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
const { email, password } = req.body;
try {
let user = await User.findOne({ email });
if (!user) {
return res
.status(400)
.json({ errors: [{ msg: 'Invalid Credentials' }] });
}
const isMatch = await bcrypt.compare(password, user.password);
if (!isMatch) {
return res
.status(400)
.json({ errors: [{ msg: 'Invalid Credentials' }] });
}
const payload = {
user: {
id: user.id
}
};
jwt.sign(
payload,
config.get('jwtSecret'),
{ expiresIn: 360000 },
(err, token) => {
if (err) throw err;
res.json({ token });
}
);
} catch (err) {
console.error(err.message);
res.status(500).send('Server error');
}
}
);
module.exports = router;