如何在本地主机情况下克服Chrome的SameSite Cookie更新的影响?

15

我有一个网站,需要从另一个域名进行身份验证以登录。

我已经在chrome://flags中启用了samesite默认cookie标志,只是为了检查chrome的新更新对我的网站有何影响。

在我的部署站点中它完美地工作,但当我尝试在本地主机上运行相同的代码时,我无法登录,我失去了第三方cookies。

如果有人能解释一下原因就太好了。

4个回答

11

很不幸,所有具有SameSite=None的Cookie都必须具有Secure参数。由于您可能不会在开发服务器上运行HTTPS,这意味着您的Cookie将无法正常工作,因为这些Cookie未通过HTTPS发送。

我目前唯一知道的解决方法是检查您的环境,并为开发环境设置SameSite=Lax,并为生产环境设置SameSite=None; Secure

在Express中,您可以使用secure参数来检查是否在运行HTTPS,然后设置您的Cookie,如下所示:

const {secure} = req;
res.cookie('key', 'contents', {
  secure,
  httpOnly: true,
  sameSite: secure ? 'None' : 'Lax',
});

根据MDN的说法,它仍然可以在本地主机上工作:https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies “除了在本地主机上,它永远不会使用不安全的HTTP发送。” - Herobrine
1
在本地主机上测试了Chrome v91,但无法正常工作。 - Bersan

2

如您所知,对于跨站点cookies,我们必须指定属性SameSite=None和Secure。假设您的本地主机没有SSL证书,导致它停止工作的原因是只有通过HTTPS发送的cookie才能使用Secure属性。


1
您可以创建并使用反向代理来解决此问题。
创建一个文件夹并制作一个名为nginx.conf的文件。
server {
    listen       8080;
    server_name  yourapp-gateway-service api.yourapp.co;
    
    error_page  404              /404.html;
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location / {
        proxy_pass https://api.yourapp.com/;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Scheme $scheme;
        proxy_ssl_server_name on;
        client_max_body_size 50M;
    }
}

创建 Docker 镜像
Dockerfile
FROM nginx:1.17
ADD nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 8080
ENTRYPOINT ["nginx", "-g", "daemon off;"]

现在,您可以构建并将容器推送到注册表,或者仅使用它。 我使用gitlab,我的gitlab-ci.yaml如下所示:

image: docker:latest
services:
  - docker:dind

stages:
- package

variables:
  DOCKER_DRIVER: overlay
  CONTAINER_IMAGE: registry.gitlab.com/MYGROUP/projects/MYPROJECT-gateway:${CI_COMMIT_SHORT_SHA}
  CONTAINER_IMAGE_LATEST: registry.gitlab.com/MYGROUP/projects/MYPROJECT-gateway:LATEST

docker-build:
  stage: package
  script:
    - docker build -t ${CONTAINER_IMAGE} .
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN registry.gitlab.com
    - docker tag ${CONTAINER_IMAGE} ${CONTAINER_IMAGE}
    - docker tag ${CONTAINER_IMAGE} ${CONTAINER_IMAGE_LATEST}
    - docker push ${CONTAINER_IMAGE}
    - docker push ${CONTAINER_IMAGE_LATEST}

1
我遇到了这个问题,除了依赖于使用 SameSite: None 的 API 必须使用 HTTPS 之外,没有简单的方法来解决这个问题。

因此,我创建了一个名为 Secure Localhost 的软件来解决这个问题。

npx secure-localhost 3000

这将代理所有https://localhost请求到http://localhost:3000。请注意,该软件会在Windows的当前用户级别上自动生成并安装自签名证书(目前仅适用于Windows)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接