Apache VirtualHost с аутентификацией, веб-сокеты

Я использую сервер Spotify на своем Raspberry Pi в школьном магазине робототехники. Он находится в школьной сети Wi-Fi, и доступ к нему осуществляется через веб-страницу http: // локальный: 6680. Я хотел добавить базовую HTTP-аутентификацию (имя пользователя / пароль), потому что люди были злонамеренными, поэтому я использую Apache VirtualHost в качестве прокси с базовой аутентификацией.

Кроме того, веб-сервер требует, чтобы веб-сокеты работали через тот же порт. Я успешно настроил файл VirtualHost, и он работает нормально ... за исключением того, что он не работает в Safari или iOS. После просмотра консоли все запросы WebSocket в Safari возвращают ошибку 401:

WebSocket connection to 'ws://XX.XXX.XX.XXX/iris/ws/' failed: Unexpected response code: 401

Изучив это больше, очевидно, это известная ошибка с Safari. Вот файл VirtualHost:

<VirtualHost *:80>
  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined

  <Proxy *>
    Allow from all
  </Proxy>

  ProxyRequests On

  ProxyPass /mopidy/ws/ ws://localhost:6680/mopidy/ws/
  ProxyPassReverse /mopidy/ws/ ws://localhost:6680/mopidy/ws/

  ProxyPass /iris/ws/ ws://localhost:6680/iris/ws/
  ProxyPassReverse /iris/ws/ ws://localhost:6680/iris/ws/

  <Location />
    ProxyPass http://localhost:6680/
    ProxyPassReverse http://localhost:6680/

    AuthType Basic
    AuthName "Restricted Content"
    AuthUserFile /etc/apache2/.htpasswd
    Require valid-user
  </Location>
</VirtualHost>

Есть ли способ просто удалить аутентификацию для просто веб-сокетов, но не для веб-страницы? Учитывая, как это структурировано, это должно быть так, но это не так. Спасибо!

Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
3
0
892
3

Ответы 3

Я мало что знаю о WebSockets, но знаю, что вы всегда должны объявлять порт VirtualHost, который вы слушаете, если хотите разделить трафик.

Попробуйте сделать это, добавив два разных VirtualHost в одну конфигурацию:

<VirtualHost *:80>
  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined

  <Directory "/">
    AllowOverride All
    AuthType Basic
    AuthName "Restricted Content"
    AuthUserFile /etc/apache2/.htpasswd
    Require valid-user
  </Directory>
</VirtualHost>

С этого момента ничем не могу помочь:

<VirtualHost *:6680>
 somethingsomethingsomething
</VirtualHost>

Обновлять

Движение отличается от: 80, я думаю, в вашей школе заблокирован. Я могу предложить более радикальный подход - запретить весь трафик Safari (как для настольных компьютеров, так и для мобильных устройств). Вы можете изменить конфигурацию, добавив перенаправление на страницу вежливости, например «ваш браузер не поддерживается».

 <Location *>
 SetEnvIfNoCase User-Agent .*Safari* bad_browser
 Deny from env=bad_browser
 </Location>

Я не хочу, чтобы он размещался на порту 6680, я хочу, чтобы он проксировался с 6680 на 80, с HTTP-аутентификацией, но без аутентификации в ws. Ваш пример прокси-сервера как на порт 80, так и на порт 6680, что я не хотел бы делать.

Jamsheed Mistri 10.10.2018 05:50

отредактировал свой пост с небольшой интеграцией, надеюсь, это поможет

Daniele INeDiA 11.10.2018 10:49

Это не ответ на мой вопрос

Jamsheed Mistri 12.10.2018 19:52

При необходимости убедитесь, что вы проксируете свои веб-сокеты. Они могут выглядеть примерно так:

ProxyPass        /socket.io http://localhost:6680/socket.io
ProxyPassReverse /socket.io http://localhost:6680/socket.io

Я делаю это в строках 11-15.

Jamsheed Mistri 12.10.2018 19:53

права жаль не заметил. Удачи в том, что может случиться? Странно, как ты говоришь, только он не работает в браузере IOS. Я имел дело с сокетами, но не имел этой проблемы. У меня возникла проблема с заголовками и прокси-серверами из разных источников.

sirshakir 16.10.2018 18:16

Спасибо за попытку помочь. Это проблема с WebSockets, требующими аутентификации. Все браузеры, кроме Safari, отправляют заголовки аутентификации, когда они делают запрос ws, поэтому я просто хочу отключить требование аутентификации для всех запросов ws. Я так и не понял.

Jamsheed Mistri 17.10.2018 03:55

Не знаю, как настроено ваше приложение. Вы должны просто иметь возможность запрашивать данные для входа в систему для доступа к защищаемому приложению. Я не понимаю, зачем нужно аутентифицировать веб-сокет. Если пароль пользователя правильный, разрешите им отобразить веб-страницу, иначе выполните повторную аутентификацию.

sirshakir 13.03.2019 17:38

Попробуйте сделать следующее, как описано здесь:

#In your case it will be like this:
<LocationMatch /(iris|mopidy)/ws>
  Allow from all
</LocationMatch>

Обновление: помните, что это правило настолько широко, насколько вы видите.

К сожалению, это не работает. Никаких дополнительных ошибок или чего-то еще, я просто добавил это в конец моего файла VirtualHost, и та же проблема сохраняется.

Jamsheed Mistri 15.10.2018 23:56

Другие вопросы по теме