本地开发/调试时的 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