nodejs restify with nginx reverse proxy не может получить сеанс работ - PullRequest
0 голосов
/ 19 февраля 2020

сначала немного предыстории: я использую restify framework для моего nodejs api-сервера и использую реагирование на взаимодействие клиента с сервером. Я настроил оба проекта на одном VPS с обратным прокси nginx, чтобы позаботиться о двух разных доменных именах: example_server.com, example_client.com, и оба https были включены с помощью letEncrypted.

поэтому, когда я захожу на example_server.com, мой nginx берет меня на localhost: server_port и показывает правильный контент, клиент работает так же.

Вот моя проблема:

моему клиенту реакции, подключенному к серверу восстановления, не удалось запустить сеанс, серверу не удалось настроить сеанс для клиента. это может быть связано с nginx проблемой обратного прокси, кто-то, использующий express framework для сервера, имеет ту же проблему, но исправлен с помощью app.set('trust proxy', 1). но в restify такой опции нет. Я действительно не хочу менять свой код с restify на express, так что я могу сделать?

мой сервер nginx setup:

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 setup:

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, при локальной разработке он работает хорошо, но на VPS-сервере с nginx он не работает. Вот фрагмент кода:

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 },
}))

любая помощь будет признательна!

1 Ответ

0 голосов
/ 19 февраля 2020

оказывается, что проблема вызвана двумя разными доменами.

Клиент React www.myReactClient.com может подключиться к серверу Restify API www.myRestifyServer.com с включенным CORS, после чего сервер сгенерирует сеанс, сохранит его при себе, отправив только идентификатор сеанса на клиентскую сторону с cook ie.

клиент React должен нести этот повар ie и отправлять идентификатор сеанса обратно на сервер всякий раз, когда он делает запрос, чтобы сервер распознал этого клиента.

Однако из-за использования двух разных доменов повар ie считался «сторонним поваром ie», а браузер блокировал этот вид приготовления по умолчанию ie, поэтому повар ie остается там, но никогда не используется, поэтому сервер не получит идентификатор сеанса.

Итак, Короче говоря, после того, как я изменил настройку браузера на НЕ заблокировать третье лицо печеньки, все работает как запланировано. Затем я меняю два разных домена на один домен с одним поддоменом, www.myReactClient.com для хостинга React Client, api.myReactClient.com для хостинга сервера Restify API, сторонняя проблема cook ie также будет решена.

...