如何让cookie在同一个域上的不同端口之间工作

时间:2017-06-24 15:06:21

标签: javascript http express cookies cors

我有一个本地环境,我正在尝试从端口3000上提供的客户端登录到端口4000上运行的服务。

我已经读过,Cookie应该与端口无关,但是我无法让它工作。我使用的是Chrome,当我登录该服务时,会收到以下响应标题:

FROM: http://app.dev:3000
TO: http://app.dev:4000/login/local

HTTP/1.1 200 OK
X-Powered-By: Express
Access-Control-Allow-Origin: http://app.dev:3000
Vary: Origin, X-HTTP-Method-Override
Access-Control-Allow-Credentials: true
Content-Type: application/json; charset=utf-8
Content-Length: 304
ETag: W/"130-fdQBs605dSVTeEqXEuXrvdcQTLk"
set-cookie: auth=TOKEN; Path=/; Expires=Sun, 25 Jun 2017 01:48:41 GMT
Date: Sat, 24 Jun 2017 13:48:41 GMT
Connection: keep-alive

但是浏览器不会保存cookie,随后对服务的请求也不包含cookie。当我使用Postman应用程序登录时,cookie将被存储并显示在浏览器上。通过邮递员的后续请求包括cookie,一切正常。但是,浏览器中的后续请求仍然不包含cookie。

登录后对服务的示例请求。未发送cookie。

FROM: http://app.dev:3000
TO: http://app.dev:4000/api/me

GET /api/me HTTP/1.1
Host: app.dev:4000
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
accept: application/json
Origin: http://app.dev:3000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 Safari/537.36
content-type: application/x-www-form-urlencoded
DNT: 1
Referer: http://app.dev:3000/
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8,fi;q=0.6

我之前将Cookie域设置为app.dev,而且它只是HTTP。它仍然在Postman中工作,但不在浏览器中。我一直在尝试删除这些安全功能,但它仍然无法正常工作。当我在浏览器中通过postman和fire请求登录时,它只会将cookie发送到app.dev:3000而不是端口4000。

有人能指出我正确的方向吗?饼干毕竟不是端口不可知的吗?我在客户端使用请求库,在服务中使用Express和express-session。

1 个答案:

答案 0 :(得分:0)

我在另一个问题中找到答案:

What can cause a cookie not to be set on the client?

request库文档未提及withCredentials选项,但我尝试将其设置为true。突然间,cookie得到了保存,并在随后的请求中发送。

const requestBase = request.defaults({
  baseUrl: 'http://app.dev:4000/',
  withCredentials: true,
});