Не удалось создать файлы cookie при использовании ngrok с перезаписью заголовка

Я использую докер в качестве локальной среды разработки и использую dinghy-http-proxy, который добавляет новый TLD .docker для сопоставления запроса с контейнером nginx-proxy.

Мои веб-сайты обычно доступны через URL-адрес, например http://devel.domain.com.docker.

Я хочу использовать ngrok для локальной разработки при доступе к удаленным веб-перехватчикам.

Я успешно запустил ngrok с помощью команды:

ngrok http -host-header=rewrite devel.domain.com.docker 80

Я могу получить доступ к форме входа в свое веб-приложение по адресу http://randomsubdomain.ngrok.io.

Однако я не могу войти в систему, потому что похоже, что сеанс cookie не может быть установлен.

Действительно, сеансы файлов cookie пытаются установить для домена devel.domain.com.docker, но поскольку мы используем randomsubdomain.ngrok.io в браузере, они блокируются по соображениям безопасности.

Как я могу обойти эту проблему? Мне что-то не хватает в моей конфигурации? Подходит ли ngrok для того, чего я хочу достичь?


person mperrin    schedule 07.01.2017    source источник


Ответы (2)


На вопрос прямо в службу поддержки ngrok.io получил такой ответ:

Нет, вы ничего не упускаете, это просто нежелательный побочный эффект перезаписи заголовка хоста. Перезапись заголовка хоста работает только для некоторых приложений из-за подобных сложностей (и других, связанных с javascript, перекрестным происхождением и т. Д.). Если возможно, всегда лучше перенастроить ваш сайт, чтобы он принимал заголовок хоста ngrok.io.

Однако я нашел решение, проверив, содержит ли запрос в заголовке x-original-host домен ngrok.io, а затем изменил механизм сеанса (в PHP session_set_cookie_params), чтобы вместо этого использовать домен x-original-host.

person mperrin    schedule 09.01.2017
comment
Вот это да. Спасибо за публикацию! Я просто потратил 8 часов, пытаясь понять, почему мои куки не сохраняются. Однако в моей ситуации я использую Ruby on Rails, и файлы cookie не сохраняются, потому что я просто не указал -host-header = rewrite. Добавил это, и это сработало отлично. - person Peter P.; 01.10.2017
comment
Больше информации: у меня возникли проблемы с тем, чтобы заставить это работать, и я понял, что это не работает в браузере Chrome, но работает в Firefox! Я спросил ngrok об этом, и Алан сказал: да, я полагаю, это хромированная настройка безопасности? но я никогда не заглядывал в нужный флажок, чтобы выключить его. Правильный способ заставить его работать в Chrome - это изменить: domain = .ngrok.io на domain = mydomain.ngrok.io - Я понял, что использую Rails, и у меня есть опция domain:: all в моих настройках cookie. Я удалил это в среде разработки, и теперь он отлично работает! - person Peter P.; 25.10.2017
comment
Раньше ngrok работал у меня с настройкой domain: all в конфигурации хранилища сеансов в моем приложении Rails. Но недавно я столкнулся с аналогичными проблемами с ngrok и поддоменами. Приведенный выше комментарий от @PeterP мне помог. Теперь мне нужно было просто установить domain: 'mydomain.ngrok.io' для локального тестирования вместо :all. - person Rohan Daxini; 18.01.2019

Как сказал mperrin, вам необходимо изменить механизм сеанса php cookie.

Чтение из session_set_cookie_params:

Установите параметры cookie, определенные в файле php.ini. Эффект от этой функции длится только на время сценария. Таким образом, вам нужно вызывать session_set_cookie_params () для каждого запроса и до вызова session_start ().

Самый важный аргумент - $domain, и чтобы ngrok работал одинаково хорошо, вы также можете использовать перед session_start() командой ini_set() (см. ini_set): ini_set('session.cookie_domain', 'xxx.ngrok.io');

Мне также потребовалось несколько часов, чтобы решить эту проблему для моей настраиваемой хостинг-платформы php, но я знал, что моя подсистема аутентификации должна работать под допустимым именем хоста, кроме localhost, поэтому я сосредоточился на том, как файлы cookie устанавливаются из моего кода.

Такие настройки среды php должны быть установлены заранее любой достойной средой php, и это было одной из моих основных целей, когда я начал ее создавать (в моем случае мне нужно только изменить значение в текстовом файле json на сервере).

person centurian    schedule 13.06.2018