node.js - CORS 调用后 Express session cookie 不会保留

标签 node.js session cookies cors cross-domain

我正在使用 Express 设置 Node.JS 服务器,在端口 localhost:3005 上运行。我有一个用 AngularJS 开发的客户端,在端口 localhost:5000 上运行。

我设置了护照身份验证。当我尝试通过控制台或 postman 使用curl命令时,一切正常。

我正在调用“/login”路由(post),然后调用“/authrequired”来了解用户是否经过身份验证。服务器可以通过存储在客户端的 session cookie 来识别用户。一切正常。

事实上,每次我调用服务器时,都会使用相同的 session ID 来标识用户。例如:84e3ff8a-b237-4899-aa1f-4a3d047e0c3f。

但是,当我在网络客户端应用程序中尝试相同的路线时,它不起作用。每次调用服务器时,都会定义一个新的 session ID。

这是 header 请求:

Host: 127.0.0.1:3005
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0
Accept: application/json, text/plain, */*
Accept-Language: fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://localhost:5000/
Content-Type: application/json;charset=utf-8
Content-Length: 33
Origin: http://localhost:5000
Connection: keep-alive

这是响应:

HTTP/1.1 200 OK
X-DNS-Prefetch-Control: off
X-Frame-Options: SAMEORIGIN
Strict-Transport-Security: max-age=15552000; includeSubDomains
X-Download-Options: noopen
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Access-Control-Allow-Origin: *
Content-Type: application/json; charset=utf-8
Content-Length: 76
ETag: W/"4c-UHE7wFwyy1/IvgicFsT1YzsRJZ4"
set-cookie: connect.sid=s%3A91e84b8a-63d2-4f01-b28b-882ce1cf1dd5.iIGDvmpU326AF34uAXg%2Bmy1ee28BUGw8TXrFBG0ogKc; Path=/; Expires=Fri, 28 Dec 2018 18:30:50 GMT
Date: Thu, 27 Dec 2018 18:30:50 GMT
Connection: keep-alive

正如我们所见,存在一个 set-cookie header 。但当我查看浏览器的cookie存储时,它不存在。我认为这就是服务器无法识别客户端的原因,因为客户端不会将 session cookie 发送到服务器。

这是我的服务器配置:

app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
app.use(cors())
app.use(express.static('data/images'))
app.use(cookieParser())
app.use(session({
  genid: (req) => {
    return uuid()
  },
  store: new FileStore(),
  secret: 'test',
  resave: false,
  saveUninitialized: false,
  cookie: {
    secure: false,
    httpOnly: false,
    path: '/',
    maxAge: 1000 * 60 * 60 * 24
  }
}))
app.use(passport.initialize())
app.use(passport.session())

这是我来自客户端的请求:

$http.post(self.url + '/login', {
  idUser: $scope.name,
  password: $scope.password
}, {
  // withCredentials: true
})

我还将这两行配置添加到我的客户端应用程序中:

$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];

当我将“withCredentials”选项添加为 true 时,网络浏览器出现错误: 访问位于“http://127.0.0.1:3005/login”的 XMLHttpRequest '来自原点'http://localhost:5000 ' 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:当请求的凭据模式时,响应中“Access-Control-Allow-Origin” header 的值不得为通配符“*”是“包含”。 XMLHttpRequest发起请求的凭证模式由withCredentials属性控制。

我尝试了很多 stackoverflow 上的解决方案,但都失败了。

我希望拥有相同的 session ID 才能执行身份验证。

最佳答案

您无法为在“Access-Control-Allow-Origin”中使用通配符的服务器设置“withCredentials”标志。您必须返回特定值“http://localhost:5000 ”并添加值为“true”的 header Access-Control-Allow-Credentials 。然后凭据将随请求一起发送。

关于node.js - CORS 调用后 Express session cookie 不会保留,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53951166/

相关文章:

javascript - 当监视文件被修改时生成 ls ENOENT

node.js - 设置 node.js 数据库 MongoDB/Redis 的最佳方式?

java - session 是在第一个请求后自动创建的吗?

ajax - Django 1.9 AJAX 表单 CSRF token 403 错误 - "CSRF cookie not set"

javascript - 单击和选择时设置cookie

javascript - 通过命名管道在 bash 和 JavaScript 之间传递消息

javascript - Sequelize.js 插入一个具有一对多关系的模型

PHP:如何检测 session 是否自动过期?

session - go-swagger 不调用我的标题检查

javascript - document.cookie 没有返回所有的 cookie