Я нахожусь в процессе отделения моего интерфейса от моего внутреннего репо.При этом я размещаю свой сервер на персональном 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.
Любая помощь будет принята с благодарностью!