【问题标题】:Setting a cookie from a remote domain for local development从远程域设置 cookie 用于本地开发
【发布时间】:2023-12-13 20:02:01
【问题描述】:

所以我正在尝试为本地开发设置环境,以便从我的开发服务器dev.mydomain.com 提取数据。

提供数据的 tornado REST 服务器使用基于 cookie 的身份验证。

为了获取 cookie,我向服务器发送了一个 AJAX 登录请求(来自网站 localhost),然后安全 cookie 在响应中返回。我可以在 chrome 控制台(网络->cookies)中看到这一点。它具有正确的名称、值、域 (dev.mydomain.com) 以及所有内容。

但是,cookie 没有设置,随后的 REST 请求失败。它与跨域无关。如果我转到 dev.mydomain.com 并在另一个选项卡中手动登录,则 cookie 会正确设置,并且我从本地域发送的所有后续请求都可以正常工作(因为它们获取了现在存在的 cookie)。

我所有的请求都包含这个:

xhrFields: {
  'withCredentials': true
}

这就是我的龙卷风服务器设置 cookie 的方式:

self.set_secure_cookie(
  COOKIE_NAME, tornado.escape.url_escape(str(COOKIE_VALUE)),
  expires_days=1, domain="dev.mydomain.com"
)

知道如果登录请求来自localhost,为什么没有设置cookie吗?

我尝试将 127.0.0.1 映射到 foo.mydomain.com(无论值多少),但这无济于事。

另外,我无法使用 javascript 获取 cookie。试过xhr.getResponseHeader('Set-Cookie');,结果为空。

【问题讨论】:

  • 可能是协议不匹配。我从 dev.mydomain.com 请求,并在 http 上运行 localhost。
  • 不,好像不是这样。

标签: javascript python cookies cross-domain tornado


【解决方案1】:

不知何故,如果您将 cookie 设置为 dev.mydomain.com,那么它对 foo.mydomain.comlocalhost 都不起作用。

如果你这样做会发生什么:

self.set_secure_cookie(
  COOKIE_NAME, tornado.escape.url_escape(str(COOKIE_VALUE)),
  expires_days=1, domain=".mydomain.com"
)

*.mydomain.com 可能会工作。

编辑:

实际上,我一遍又一遍地检查,我找不到人们使用参数“域”作为set_secure_cookie() 的示例,但这个参数存在于“set_cookie()”中,如 @987654321 中所述@:

附加关键字参数直接在 Cookie.Morsel 上设置。 见http://docs.python.org/library/cookie.html#morsel-objects 可用的属性。

如果您确定要使用安全 cookie,则应首先确保在应用程序设置中使用 cookie 密码

class Main(web.Application):
    def __init__(self):
        settings = dict(
            cookie_secret = "xxxx",
        )

然后尝试设置安全cookie,而不指定域

self.set_secure_cookie(
  COOKIE_NAME, tornado.escape.url_escape(str(COOKIE_VALUE)),
  expires_days=1
)

【讨论】:

  • 我明白了 - 我正在使用安全 cookie 和常规 cookie,但似乎没有任何效果。我想我会改用这个解决方案 - *.com/a/3342225/1731005。也许一个人真的不应该能够访问这样的 cookie 来存储它(但只有在它被存储在与服务器运行的同一域中时才获取它)。
最近更新 更多