本地开发/调试时的 httpOnly cookie

Posted

技术标签:

【中文标题】本地开发/调试时的 httpOnly cookie【英文标题】:httpOnly cookie when developing/debugging locally 【发布时间】:2015-05-02 23:02:15 【问题描述】:

我有一个 Web 客户端和几个 Web 服务(以及一个身份验证服务)。我在web-test.domain.com 上运行网络,在services-test.domain.com 上运行服务。

为了调试,我在本地运行 一些 的 Web 服务。但问题是,当我在本地运行身份验证服务 (设置 cookie)services-test.domain.com 上的其他服务时,cookie(带有 sessionID)不会随请求一起发送到另一个网站服务(因为它的域是 localhost 并且它们没有在本地运行),所以它们总是抛出 401 Unauthorized 异常并且我会自动从网络上注销。

这是因为 auth 服务在 localhost 上运行,所以响应是一个带有 Domain=localhost 的 cookie,但是当请求发送到其他 Web 服务时,没有发送任何 cookie,因为它是一个 httpOnly localhost cookie。导致其他网络服务认为我没有登录。

有什么方法可以在本地运行身份验证服务并获得一个跨域工作的 httpOnly cookie(对于 localhost 和 services-test.domain.com)

在使用 httpOnly 特定于域的 cookie 时,在本地开发、调试和运行设置 cookie 的 auth 服务时,您是如何做到这一点的?

这是一个演示问题的图像:

可能的解决方案:

    在本地运行所有 Web 服务。 转到web-test.domain.com,登录并获取该域的cookie(会话A)。然后登录本地正在运行的服务并获取 localhost(会话 B)的 cookie。然后会话 A 将用于所有外部服务,会话 B 将用于所有本地服务。 将 services-test.domain.com 添加到 /etc/hosts 文件中,以便为该域设置 cookie,并且也适用于外部服务。

编辑:我目前正在使用#2。但这对我来说并不完全有意义,因为有两个不同的会话。

【问题讨论】:

【参考方案1】:

如https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials所指定

来自不同域的 XMLHttpRequest 响应无法设置 cookie 除非...

您可以通过添加一些标志来解决这个问题,这样您就可以在不同的域上设置 cookie。 您的所有XMLHttpRequest 请求都需要使用以下标志:withCredentials: true

此外,您的后端服务器需要使用特殊标头 (Access-Control-Allow-Credentials: true) 进行响应,以允许在跨源请求上发送 cookie。


确保仅在调试模式下执行这些操作。如果您的应用程序处于开发模式,您需要添加 withCredentials:true,您也可以运行脚本将 Access-Control-Allow-Credentials 添加到后端 Web 服务器(例如 nginx 或向您的 API 添加配置)

请注意,如果您添加 Access-Control-Allow-Credentials: true,CORS 通配符 (*) 将不起作用,您需要明确指定主机、方法和标头。

【讨论】:

以上是关于本地开发/调试时的 httpOnly cookie的主要内容,如果未能解决你的问题,请参考以下文章

即使使用 httpOnly 使用 cookie 编辑器,我仍然可以编辑 cookie

将 JWT 令牌存储到 HttpOnly cookie 中

求助QAQ chrome要怎么解除cookies的httponly

浅谈Cookie、HttpOnly那点事儿

如何在前端使用 HttpOnly jwt cookie

将“HttpOnly”属性添加到所有会话 cookie