首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Express中从客户端向服务器发送cookie?

如何在Express中从客户端向服务器发送cookie?
EN

Stack Overflow用户
提问于 2019-06-13 05:58:25
回答 1查看 0关注 0票数 0

我正在尝试实现用户登录功能。但是,我无法将存储在浏览器中的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

代码语言:javascript
复制
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

代码语言:javascript
复制
// @ 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

代码语言:javascript
复制
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}`));

EN

回答 1

Stack Overflow用户

发布于 2019-06-13 15:14:40

您可以使用内置函数使用Cookie Parser从节点检索cookie。

代码语言:javascript
复制
// retrieve signed cookie
var cookieName = req.signedCookie["cookieName"];

// retrieve normal cookie
var cookieName = req.cookie["cookieName"]

如果您尝试从客户端发送cookie到节点,我建议您使用以下功能获取cookie:

代码语言:javascript
复制
 const getCookie = function(name) {
    var re = new RegExp(name + "=([^;]+)");
    var value = re.exec(document.cookie);
    return (value !== null) ? unescape(value[1]) : null;
 };

然后AJAX将cookie发布到帖子网址。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100007014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档