使用nginx反向代理进行nodejs重整无法获取会话作品

问题描述 投票:0回答:1

首先有一点背景知识:我为我的nodejs api服务器使用restify框架,并为客户端与服务器交互使用react。我使用nginx反向代理在一个VPS中设置了两个项目,以使用两个不同的域名进行维护:example_server.comexample_client.com,并且都使用letEncrypted启用了https。

所以当我访问example_server.com时,我的Nginx将我带到localhost:server_port并显示正确的内容,客户端的工作方式相同。

这是我的问题:

我连接到Restify服务器的React Client无法获得会话工作,该服务器无法为该客户机设置任何会话。它可能与nginx反向代理问题有关,有人为服务器使用快速框架存在相同的问题,但已使用app.set('trust proxy', 1)进行了修复。但请再说一遍,没有这样的选择。我真的不想将我的代码从再验证更改为表达,所以我该怎么办?

我的服务器nginx设置:

server {
    server_name server_example.com www.server_example.com;
    location / {
        proxy_pass http://127.0.0.1:6000;
        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_redirect off;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
}

我的客户端nginx设置:

server {
    server_name client_example.com www.client_example.com;
    location / {
        proxy_pass http://127.0.0.1:7000;
        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_redirect off;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
}

我使用express-session在我的Restify服务器中处理会话,在本地开发中运行良好,但是在具有Nginx的VPS服务器中,它无法正常工作。这是代码段:

var constant = require('./config/constant.json');
var session = require('express-session');

var restify = require('restify');

var corsMiddleware = require("restify-cors-middleware"); 
const cors = corsMiddleware({  
  origins: constant.client_urls,
  credentials: true,
  allowHeaders: ["Authorization"],
  exposeHeaders: ["Authorization"]
});

var server = restify.createServer();
server.use(restify.plugins.queryParser());
server.use(restify.plugins.jsonp());
server.pre(restify.plugins.pre.userAgentConnection());

server.pre(cors.preflight);  
server.use(cors.actual);


//server.set('trust proxy', 1);  restify didn't has such option, err: .set is not a function.
server.use(session({
  secret: constant.session_secret, 
  proxy: true,
  resave: false,
  saveUninitialized: true,
  cookie: { maxAge: 3600000, secure: true },
}))

任何帮助将不胜感激!

node.js session nginx express-session restify
1个回答
0
投票

原来问题是由两个不同的域引起的。

React客户端www.myReactClient.com能够连接到启用了CORS的Restify API服务器www.myRestifyServer.com,然后服务器将生成一个会话,并保留其自身,而仅通过cookie将会话ID发送给客户端。

React客户端应该携带该cookie并在每次向其发出请求时将会话ID发送回服务器,以便服务器识别该客户端。

但是,由于使用了两个不同的域,该cookie被视为“第三方cookie”,并且浏览器默认情况下会阻止这种cookie,因此该cookie保留在那里但从未被使用过,因此服务器将不会收到该cookie。会话ID。

所以,总而言之,当我将浏览器设置更改为NOT阻止第三方cookie后,一切都会按计划进行。然后,我将两个不同的域更改为带有一个子域的一个域,www.myReactClient.com用于托管React Client,api.myReactClient.com用于托管Restify API服务器,也解决了第三方Cookie问题。

© www.soinside.com 2019 - 2024. All rights reserved.