我正在尝试实现用户登录功能。但是,我无法将存储在浏览器中的cookie发送回服务器。目前,我有auth中间件,用于检查用户是否拥有正确的cookie。具体来说,我不知道如何发送令牌,以便req.header('x_auth_token');
在auth中间件可以访问它。我已经包含了cookie-parser,所以我认为访问令牌不应该有任何问题。目前,res.cookie('x_auth_token', token);
当用户登录/注册时,我必须将令牌设置为更加明显。但是,访问cookie的格式可能是错误的吗?应该是这样req.header.cookie('x_auth_token')
吗?
在浏览器应用程序选项卡中,cookie确实存在如下。名称:x_auth_token值:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7ImlkIjoiNWQwMTVjMDQyYTA4OTkyMmIxMjY5MDJmIn0sImlhdCI6MTU2MDM3MDE4MCwiZXhwIjoxNTYwNzMwMTgwfQ.qEdG8HLCgvqW8urtUqfi5wY0r2WoYQ_r5GV9HHG1xOg
auth.js
const jwt = require('jsonwebtoken');
const config = require('config');
// middleware function, next so it moves on to the next middlware
module.exports = function(req, res, next) {
//get the 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 if exist
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' });
}
};
用户/ JS
// @ route POST api/users
// @desc Register User
// @access Public
router.post(
'/',
[
check('name', 'Name is required')
.not()
.isEmpty(),
check('email', 'Please include a valid email').isEmail(),
check(
'password',
' Please enter a password with 6 or more characters'
).isLength({ min: 6 })
],
async (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({
errors: errors.array()
});
}
const { name, email, password } = req.body;
try {
// See if user exists, have to be unique
let user = await User.findOne({ email });
if (user) {
return res
.status(400)
.json({ errors: [{ msg: 'User already exists' }] });
}
user = new User({
name,
email,
avatar,
password
});
const salt = await bcrypt.genSalt(10);
user.password = await bcrypt.hash(password, salt);
await user.save();
const payload = {
user: {
id: user.id
}
};
jwt.sign(
payload,
config.get('jwtSecret'),
{ expiresIn: 60 * 60 * 100 },
(err, token) => {
res.cookie('x_auth_token', token);
res.json({ token });
}
);
} catch (err) {
console.error(err.message);
res.status(500).send('Server error');
}
}
);
server.js
const express = require('express');
const connectDB = require('./config/db');
const path = require('path');
const exphbs = require('express-handlebars');
const cookieParser = require('cookie-parser');
const app = express();
// for auto reload
const http = require('http');
const reload = require('reload');
connectDB();
//Init middleware
app.use(express.json()); // parses application/json
// parse the cookie
app.use(cookieParser());
app.use(express.urlencoded({ extended: true })); // parses application/x-www-form-urlencoded
app.engine('handlebars', exphbs());
app.set('view engine', 'handlebars');
app.use(express.static(path.join(__dirname, 'public')));
app.get('/', (req, res) => res.render('index'));
app.get('/register', (req, res) => res.render('register'));
app.get('/post', (req, res) => res.render('post'));
app.use('/api/users', require('./routes/api/users'));
app.use('/api/users', (req, res) => {
const token = req.cookies.x_auth_token;
});
app.use('/api/auth', require('./routes/api/auth'));
app.use('/api/profile', require('./routes/api/profile'));
app.use('/api/posts', require('./routes/api/posts'));
app.use('/posts', require('./routes/api/posts'));
const PORT = process.env.PORT || 5000;
// for auto reload
const server = http.createServer(app);
server.listen(PORT, () => console.log(`Server started on port ${PORT}`));
reload(app);
// app.listen(PORT, () => console.log(`Server started on port ${PORT}`));
发布于 2019-06-13 15:14:40
您可以使用内置函数使用Cookie Parser从节点检索cookie。
// retrieve signed cookie
var cookieName = req.signedCookie["cookieName"];
// retrieve normal cookie
var cookieName = req.cookie["cookieName"]
如果您尝试从客户端发送cookie到节点,我建议您使用以下功能获取cookie:
const getCookie = function(name) {
var re = new RegExp(name + "=([^;]+)");
var value = re.exec(document.cookie);
return (value !== null) ? unescape(value[1]) : null;
};
然后AJAX将cookie发布到帖子网址。
https://stackoverflow.com/questions/-100007014
复制相似问题