9

我有一个需要从另一个站点进行身份验证才能登录的网站。两者是不同的域。

默认情况下,我从 chrome://flags 启用了相同的站点 cookie 标志。只是为了在我的网站上查看 chrome 的新更新效果如何。

它在我部署的站点中运行良好。但是当我尝试在我的本地主机中运行相同的内容时,我无法登录。我丢失了第三方 cookie。

如果有人解释原因,那就太好了。

4

4 回答 4

7

不幸的是,所有 cookieSameSite=None也必须有一个Secure参数。由于您不太可能在开发服务器上运行 HTTPS,这意味着您的 cookie 将无法工作,因为 cookie 不是通过 HTTPS 发送的。

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

在 Express 中,您可以使用该secure参数检查您是否在 HTTPS 上运行,然后按如下方式设置您的 cookie:

const {secure} = req;
res.cookie('key', 'contents', {
  secure,
  httpOnly: true,
  sameSite: secure ? 'None' : 'Lax',
});
于 2020-10-12T20:56:32.063 回答
1

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

于 2020-08-08T22:45:24.370 回答
0

您可以创建并使用反向代理来解决此问题。

创建一个文件夹并制作一个名为

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;
    }
}

创建一个泊坞窗图像

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}
于 2022-01-09T07:58:57.783 回答
0

我遇到了这个问题,没有简单的方法来解决这个问题,除非我必须使用 HTTPS 如果我使用的 API 使用SameSite: None.

于是我开发了一个软件来解决这个问题。

npx secure-localhost 3000

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

于 2021-11-10T05:49:46.293 回答