【问题标题】:Making a set by express server cookie be visible to client通过快速服务器 cookie 设置对客户端可见
【发布时间】:2020-04-18 10:49:33
【问题描述】:

我是 Express 的新手,发送 cookie 时遇到问题。 我制作了一个简单的快速应用程序,需要为浏览器设置一个 cookie。这是服务器:

const express = require('express');
const cookieParser = require('cookie-parser');
const cors = require('cors');

const app = express();

//app.use(cors());
app.use((req, res, next) => {
    res.append('Access-Control-Allow-Origin', ['http://127.0.0.1:5500']);
    res.append('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.append('Access-Control-Allow-Headers', 'Content-Type');
    res.append('Access-Control-Allow-Credentials', 'true');
    next();
});
app.use(cookieParser());
app.use(express.json());

const PORT = 9000;

app.get('/', (req, res) => {
    res.setHeader('Content-Type', 'application/json');
    res.cookie('testCookie', 'random value', {httpOnly: false, secure: false});
    res.send({user: "test", password: "test123"});
})

app.listen(PORT, console.log(`Server started on port ${PORT}`));

所以它成功地通过 fetch 向浏览器发送了 testCookie:

let response = await fetch('http://localhost:9000/', {
            method: 'GET',
            mode: 'cors',
            credentials: 'include',
            headers: {
              'Content-Type': 'application/json'
            }
            }).then(response => response.json());
        console.log(response);

请求成功后,cookie 发送成功,因为它位于 Chrome cookie 选项卡中,但 document.cookie 返回一个空字符串。而且当我向页面发出请求时,请求不包含 Cookie 标头。

如何使 cookie 对 document.cookie 和浏览器可见以发送他的 Cookie 标头?

【问题讨论】:

  • 这会记录什么 console.log(req.cookies)?
  • 在服务器端,console.log(req.cookies) 成功返回 cookie,但如果我向另一个页面发出请求,cookie 将不会与 HTTP 请求中的 Cookie 标头一起发送
  • 你试过在HTTP请求的头部手动设置cookie吗?
  • 我无法手动设置它,因为我无法在浏览器中获取它 - document.cookie 返回一个空字符串,我需要的目的是将身份验证 JWT 从服务器发送到浏览器
  • 你是如何发出 HTTP 请求的,我的意思是在节点 js 中你正在这样做?请发布您的 HTTP 请求的代码。

标签: javascript node.js express cookies cross-domain


【解决方案1】:

我强烈建议你使用 npm 包:jsonwebtokenhttps://www.npmjs.com/package/jsonwebtoken

这样更干净:

const jwt = require ('jsonwebtoken');

// Create login logic here (check password etc.);


const token = jwt.sign(user, secret, expiration);

res.status(201).json({
   status: 'success',
   token
});

尝试使用 JSON 格式而不是 res.send,因为您已经有一个正文解析器,这是现代 API 中的最佳实践。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-24
    • 2020-01-19
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 2019-03-01
    • 2016-03-19
    • 1970-01-01
    相关资源
    最近更新 更多