使用服务器端的cors从axios响应中获取Cookie

时间:2018-02-17 22:43:53

标签: node.js express vue.js cors

我使用express 4.16.2和cors 2.8.4对Node.js服务器运行Vue.js 2.5.2和axios 0.17.1。

当我登录时

axios.post('/login', {"username": "a", "password": "b").then((response) => {
    console.log(response.headers['set-cookie']);
}

我得undefined作为输出。在其他topics上,他们告诉他们设置Access-Control-Expose-Headers: Access-Token, Uid。我在我的server-config中这样做了:

const express = require('express'),
cookieParser = require('cookie-parser'),
cors = require('cors'),
bodyParser = require('body-parser'),
const server = express();

server.use(cookieParser());
server.use(bodyParser.json({limit: '50mb'}));
server.use(bodyParser.urlencoded({limit: '50mb', extended: true}));

server.use(cors({
  "origin": "*", 
  "credentials": true,
  "exposedHeaders": ["Uid", "Access-Token"]
  // same for "Uid, Access-Token"
  // Adding "set-cookie" to this list did not work.
}));

我可以在Chrome开发者工具栏中看到,Access-Control-Expose-Headers - 选项在OPTION-Request和POST-Request中设置。同样在POST-Request中我可以看到set-cookie-header。但response.headers['set-cookie']的日志仍然未定义。

编辑:

此行为处于开发模式: 服务器在localhost:3000上运行,客户端在localhost:8080上运行。

当我为生产模式构建vue.js-client以便它们都在localhost:3000上运行时,它可以工作。

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

Access-Control-Allow-Credentials: true(这是'控制'是否可以在CORS请求中使用Cookie和其他'凭据')不兼容Access-Control-Allow-Origin: * - 您需要如果您想使用cookie,请指定请求来自ACAO响应标头的确切来源。

基本上,提取Origin请求标头并确保它在Access-Control-Allow-Origin响应标头中“镜像回”。在您的情况下,它可能是https://localhost:8080,但您不应对其进行硬编码 - 始终从Origin请求标头中提取它。

所以答案应该像在Origin值中指定server.use.cors.origin请求标头的值一样简单。