Проблемы с установкой файлов cookie с помощью Express.JS + Nginx - PullRequest
1 голос
/ 04 апреля 2019

Я нахожусь в процессе отделения моего интерфейса от моего внутреннего репо.При этом я размещаю свой сервер на персональном Raspberry Pi 3 в моей домашней сети.Мой интерфейс размещен на Netlify.У меня возникла проблема, когда я не могу установить файлы cookie на моем клиенте с помощью Express.Js, хотя я могу видеть набор файлов cookie в Postman.

Моя текущая настройка выглядит следующим образом:

FE (Netlify - example.com) -> Nginx (Reverse Proxy - api.example.com) -> Node.js (Express - listening for http)

Я не могу войти в свое приложение, которое использует Express-Session для сеансов.Я могу опубликовать информацию для входа в систему, но не вижу, что в ответе установлен файл cookie.Сказав это, я работаю над Heroku (FE + BE на том же репо)

Я пытался сделать несколько вещей, чтобы это заработало, но все не удалось.

Некоторые решения, которые я пробовалявляются:

  • app.set ('trust proxy', 1)
  • express-session ({proxy: true})
  • установить домен cookie для .example.com
  • включил CORS для моего домена
  • установить Axios для использования { withCredentials: true }
  • установить proxy_set_header X-Forwarded-Proto https;

NGinx Config

server {
        root /var/www/example-backend;
        server_name api.example.com;
        location / {
                proxy_pass http://127.0.0.1:3000;
                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;
                proxy_set_header Host $http_host;
                proxy_set_header X-NginX-Proxy true;
        }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

Соответствующий экспресс-код

const express = require('express');
const bodyParser = require('body-parser');
const logger = require('morgan');
const passport = require('passport');
const session = require('express-session');
const cors = require('cors');

const app = express();

const routes = require('./routes');
const server = require('./db');

app.use(logger('dev'));
app.use(cors({
  origin: 'https://example-frontend.netlify.com',
  credentials: true,

}));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.set('trust proxy', 1)
app.use(
  session({
    secret: 'secrets',
    resave: false,
    saveUninitialized: true,
    cookie: { domain: '.example-frontend.netlify.com' }
  })
);


app.use(passport.initialize());
app.use(passport.session());

const Account = require('./models/account');

passport.use(Account.createStrategy());
passport.serializeUser(Account.serializeUser());
passport.deserializeUser(Account.deserializeUser());

app.use('/api', routes);

app.listen(3000, async () => {
  await server.start();
  console.log('HTTP running on port 3000');
});

rout.js

const express = require('express');
const router = express.Router();

router.get('/testCookie', (req, res) => {
  res.cookie('test', 'hi', { domain: 'example-frontend.netlify.com'})
  res.sendStatus(200);
});

Соответствующий код внешнего интерфейса

import axios from 'axios';

const API_ROOT =
  process.env.NODE_ENV === 'production'
    ? 'https://api.example.com/api'
    : '/api';
const API_RECIPE = `${API_ROOT}/recipe`;
const API_ACCOUNT = `${API_ROOT}/account`;

export const testCookie = () =>
  axios.get(`${API_ROOT}/testCookie`, { withCredentials: true });

Я предполагаю, что это связано с кросс-оригинальные куки, но у меня закончились ресурсы, чтобы прочитать о возможной проблеме.Я чувствую, что это может быть на уровне nginx, поскольку это единственная часть, которая изменилась между текущей настройкой и настройкой Heroku.

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

...