Chrome 重定向后不发送 cookie

Chrome doesn't send cookies after redirect

在 node.js 中(使用 Hapi 框架)我正在为用户创建 link 以允许我的应用程序读取用户帐户。 Google 处理该请求并询问是否授予权限。然后 Google 使用 GET 参数作为响应代码重定向到我的服务器,这里我遇到了问题。

Google Chrome 没有发送带有 session ID 的 cookie。

如果我在 cookie 编辑扩展中将该 cookie 标记为 session cookie,它就会被发送。 php 中的行为相同,但 php 在创建 session 时将 cookie 标记为 session,因此这不是问题。我正在使用插件 hapi-auth-cookie,它创建 session 并处理有关它的一切。然后我还在 hapi-auth-cookie 设置中将该 cookie 标记为非 HttpOnly,因为这是我注意到的第一个区别,在检查 PHP session cookie 和我的 node.js 时.我在每个重定向上都有响应 401 缺少身份验证。如果我将光标放在地址栏中并按回车键,一切正常,所以这是重定向的问题。

我的问题基本上是,是什么导致了这种行为。另一方面,我不得不提到 firefox 在每次请求后都会毫无问题地发送 cookie。

Headers 重定向后(没有带 session 的 cookie):

{
    "host": "localhost:3000",
    "connection": "keep-alive",
    "cache-control": "max-age=0",
    "upgrade-insecure-requests": "1",
    "user-agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36",
    "x-client-data": "CJS2eQHIprbJAQjEtskECKmdygE=",
    "x-chrome-connected": "id=110052060380026604986,mode=0,enable_account_consistency=false",
    "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "accept-encoding": "gzip, deflate, sdch, br",
    "accept-language": "pl-PL,pl;q=0.8,en-US;q=0.6,en;q=0.4"
}

Headers 在地址栏中输入后(可以正常工作):

{
    "host": "localhost:3000",
    "connection": "keep-alive",
    "cache-control": "max-age=0",
    "upgrade-insecure-requests": "1",
    "user-agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36",
    "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "accept-encoding": "gzip, deflate, sdch, br",
    "accept-language": "pl-PL,pl;q=0.8,en-US;q=0.6,en;q=0.4",
    "cookie": "SESSID=very_long_string"
}

此问题是由于 hapi-auth-cookie 尚未处理 isSameSite(Hapi 的新功能)引起的。我们可以手动设置它,例如。

const server = new Hapi.Server(
    connections: {
        state: {
            isSameSite: 'Lax'
        }
    }
);

但请注意,默认情况下您有 'Strict' 选项,在许多情况下您可能不想更改该值。

这个问题的独立演示:https://gist.github.com/isaacs/8d957edab609b4d122811ee945fd92fd

这是 Chrome 中的错误。

Chrome 的最新版本在控制台中显示此警告:

A cookie associated with a cross-site resource at was set without the SameSite attribute. A future release of Chrome will only deliver cookies with cross-site requests if they are set with SameSite=None and Secure.

如果用户没有有效的 cookie,我的服务器会将用户重定向到身份验证服务器。身份验证后,用户将使用验证码重定向回我的服务器。如果代码通过验证,用户将再次被重定向到带有有效 cookie 的网站。

我向 cookie 添加了 SameSite=Secure 选项,但 Chrome 在从身份验证服务器重定向后忽略了 cookie。删除该选项解决了问题,但警告仍然出现。

如果引荐来源网址是不同的站点,则浏览器不会发送严格的 cookie。如果请求是来自不同站点的重定向,就会发生这种情况。使用 lax 可以解决这个问题,或者您可以让您的网站处理在您的第一次请求时无法访问严格 cookie 的问题。

最近遇到这个问题,写了更多detail on strict cookies, referrers and redirects