Назад | Перейти на главную страницу

Nginx и файлы cookie для разных поддоменов

TL; DR: как обмениваться файлами cookie между поддоменами для сервера серверного приложения, который я не могу "настроить" с использованием nginx в качестве прокси - какая-то волшебная комбинация proxy_ *?

Веб-сервер торнадо работает на "127.0.0.1:9999/ipython", который я не могу настроить (он работает как часть сервера ноутбука ipython). Я использую nginx для прокси с "www.mysite.com" на 127.0.0.1:9999 успешно (как минимум http-трафик).

Однако для части внутреннего приложения требуются веб-сокеты. Поскольку я использую CloudFlare, мне приходится использовать отдельный домен для Websockets («Websockets в настоящее время доступны только для корпоративных клиентов ... Все остальные клиенты ... должны создать поддомен для Websockets в своих CloudFlare DNS и отключить прокси CloudFlare» ). Я использую "ws.mysite.com".

Когда пользователь входит в систему на «https: // www.mysite.com», веб-сервер Tornado устанавливает cookie для «www.mysite.com» (я не могу его настроить, иначе я бы просто установил это на ".mysite.com"). Когда часть приложения websocket запускается, оно отправляет запрос на «wss: // ws.mysite.com», но не может пройти аутентификацию, потому что файл cookie установлен для другого домена («www.mysite.com»).

Возможно ли, чтобы nginx «подделал» домен, чтобы веб-сервер Tornado зарегистрировал его для «.mysite.com»? proxy_cookie_domain, похоже, не работает так, как я ожидал ... Следует ли жестко закодировать "proxy_set_header Host"?

Я думал, что конфиг nginx похож на ....

upstream ipython_server {
    server 127.0.0.1:8888;
}

server {
    listen 443;
    server_name www.mysite.com;

    ssl_certificate cert.crt;
    ssl_certificate_key cert.key;
    ssl on;

    # **** THIS DOESN'T WORK ??? ****
    proxy_cookie_domain www.mysite.com .mysite.com;

    location /ipython/static {
        proxy_pass https://ipython_server$request_uri;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /ipython/api/sessions {
        proxy_pass https://ipython_server$request_uri;
        proxy_set_header Host $host;
        proxy_set_header Origin "";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /ipython {
        proxy_pass https://ipython_server$request_uri;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location / {
            try_files $uri $uri/ =404;
    }
}

server {
    listen 443;
    server_name ws.azampagl.com;

    ssl_certificate cert.crt;
    ssl_certificate_key cert.key;
    ssl on;

    # **** THIS DOESN'T WORK ??? ****
    proxy_cookie_domain ws.mysite.com .mysite.com;

    # This is the websocket location
    location /ipython/api/kernels/ {
        proxy_pass https://ipython_server$request_uri;

        proxy_redirect off;
        proxy_http_version 1.1;
        chunked_transfer_encoding off;
        proxy_buffering off;
        proxy_read_timeout 86400;

        proxy_set_header Host $host;
        proxy_set_header Origin "";
        proxy_set_header Upgrade websocket;
        proxy_set_header Connection "upgrade";

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Искал в модуле nginx lua? Похоже, вы можете установить домены cookie, но это выглядит хакерским ...

Заранее большое спасибо за вашу помощь!

(Примечание: технически у меня есть доступ к конфигурации торнадо, но нет никакой документации о том, как установить «домен cookie» для сервера. Т.е.

c.NotebookApp.tornado_settings = {'cookie_domain????':'.mysite.com'}

)