nginx proxy_reverse 没有设置从上游服务器到客户端浏览器的 cookie

nginx proxy_reverse not setting cookie from upstream server to the client browser

我有一个 expressjs 服务器来验证来自 svelte 内置前端应用程序的登录请求。 前端应用程序 运行ning frontenddomain.com,expressjs 服务器 运行ning backenddomain.com

这是我的登录 post 验证和设置 cookie 的路由:

app.post('/login',  (req, res)=>{
   
   // check db,find the user, write a jwt token and put it in a cookie to send it to the 
   //   browser
                    res.cookie("accesstoken", accessToken) 
                    res.cookie("refreshtoken", refreshtoken)
                    res.send(...)
                  }

此服务器代码部署到 ubuntu 服务器,Nginx 运行ning 作为 proxy_reverse,这是我的 nginx 块配置:

server {        
    ... 
    
    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;

        
        proxy_cookie_domain localhost .frontenddomain.com;
        proxy_cookie_domain ~^(.+)(Domain=frontenddomain.com)(.+)$ " 
        Domain=.frontenddomain.com ";
    }  
    
}
   
server {
    listen 80;
    listen [::]:80;
        server_name backenddomain.com www.backenddomain.com;
        root /var/www/backenddomain.com;
        index index.html;
        location / {
        try_files $uri $uri/ /index.html;
    }
}

当我 运行 服务器和 svelte 应用程序(前端应用程序)使用我的本地机器时,一切正常(客户提供凭证,cookie 被发送到客户端浏览器并在检查 google 开发工具时,我确认已在客户端浏览器中正确设置cookies)

当我将我的 expressjs 服务器部署到 ubuntu (20.04) 并使用 pm2 到 运行 我的服务器时,它确实启动了,我可以查看我所有的 console.log。我的前端应用程序 运行s 和我转到我的登录页面,输入凭据并单击提交,该应用程序让我登录(因为凭据是正确的并且用户在前端应用程序本地存储上设置为 true)但是没有设置 COOKIES浏览器。

我阅读了 nginx 文档,我从不同的站点阅读了 material 和 posts 关于如何设置 Nginx proxy_reverse cookie 域但无法解决问题(问题是cookies 没有在浏览器中设置,服务器发出它们)但我的代理服务器没有将它们传递给浏览器。

这些关于 proxy_reverse 和 cookie 的问题出现了,poster 卷土重来,post 对他们自己的问题的回答含糊不清,没有其他答案。似乎没有足够的技术人员了解这个问题。

我的位置代码有 proxy_cookie_domain localhost .frontenddomain.com;

如何设置 nginx proxy_reverse 将 cookie 设置为从上游服务器传递给浏览器?

所以它与 nginx 块配置无关,但它是 cookie 设置。要使跨站点 cookie 起作用,必须使用 sameSite : none (或严格)和安全标志进行设置。确保您的后端和前端必须使用域(在撰写本文时的最新草案中不允许使用 ip)

您还需要使用 ssl 保护前域和后域 (https)。

您在 nginx 上的 ufw 需要允许 https。

Cookie 设置:

res.cookie("name", "value", { sameSite: "none", secure : true })

在更新服务器和您的 nginx conf 站点可用后重新启动您的 nginx 它应该可以工作。