Facebook.com и обнаружение Captive Portal в iOS7

Я создал маршрутизатор, который подключается к Facebook, чтобы получить некоторую информацию, прежде чем пользователь сможет получить доступ к Интернету.

Сначала они подключаются, получают страницу Captive Portal, а затем продолжают логин в facebook. После обновления до iOS7 не удается загрузить страницу входа в facebook. На моем Mac с Captive Portal Assistant проблем нет, и даже на самом телефоне при использовании iOS-версии Safari проблем нет.

Что здесь происходит не так? Является ли запрос на фильтрацию facebook от iOS7 Captive Portal Assistant или Apple делает здесь какие-то хитрые вещи?

Похоже, проблема широко распространен и связан только с facebook.

Обновление: я работал с бета-версиями, и несколько недель назад они работали нормально. Теперь с той же бета-версией это уже не так. Итак, еще один момент для объяснения facebook.

С уважением, Кас


person Cas Wolters    schedule 27.09.2013    source источник


Ответы (3)


Эта проблема была исправлена ​​Apple, начиная с IOS 8. Но поскольку все пользователи iPhone 4 не могут обновиться до IOS 8, эта проблема остается.

Устройства IOS 7 проверяют наличие следующих доменов:

www.appleiphonecell.com
captive.apple.com
captive.apple.com
www.apple.com
www.itools.info
www.ibook.info
www.airport.us
www.thinkdifferent.us

Внесение этих доменов в белый список останавливает отображение маски входа, поскольку устройство IOS считает, что Интернет работает должным образом. Таким образом, вы контролируете происходящее, поскольку устройство IOS ничего не прерывает, если вы используете обычный браузер для входа в систему.

Если вы не внесете домены в белый список, произойдет следующее. Я отлаживал его на роутерах с несколькими устройствами IOS, и все они делали в основном одно и то же:

  1. Если вы подключаетесь к Wi-Fi, устройство IOS пытается подключиться к одному из доменов, которые перечислены выше. Если он может связаться с одним из доменов, он пробует другой. Если это невозможно, он запускает перенаправление, которое контролируется маршрутизатором. Иногда он опрашивает один или несколько доменов, прежде чем решит, что интернет работает.
  2. После проверки экран входа в систему перенаправляется на ваш маршрутизатор, а затем на экран входа в ваш авторизованный портал. Это поведение осталось таким же, как и в IOS 6 или ранее.
  3. Теперь вы запускаете вход по oauth к стороннему провайдеру, такому как Facebook, Google или Twitter. А теперь разница проявляется. Вы можете проверить это на маршрутизаторе, если вы запустите его в режиме отладки. Поскольку устройство IOS переходит на другой домен для входа по oauth (например, www.facebook.com), iPhone думает, что что-то изменилось, и начинает запрашивать один из доменов Apple, перечисленных выше. Пользователь видит только белый экран, а в фоновом режиме устройство IOS пытается повторно связаться с одним из доменов. Для пользователя это кажется ошибкой, так как экран остается белым или требуется очень много времени, чтобы показать логин на стороннем провайдере. Иногда перестает загружаться и ничего не происходит навсегда.

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

Некоторые неглубокие части информации сообщаются на следующих сайтах:

Я не смог найти подробного описания проблемы и сам нашел ее выше, отлаживая все части с некоторыми маршрутизаторами и устройствами IOS, такими как iPhone и iPad.

person Fa11enAngel    schedule 05.10.2013
comment
Это просто предотвращает появление диалога. Мы хотим, чтобы диалог появился, он появляется, но перенаправление на facebook не работает. - person Cas Wolters; 11.10.2013
comment
Я знаю. Вы пытались отладить его на маршрутизаторе? Я сделал это, и я проверил поведение на маршрутизаторе и мог понять, что он делает. Я добавлю это к ответу, так как это слишком долго для комментария. - person Fa11enAngel; 12.10.2013
comment
На IOS 8 проблема ушла, но iPhone 4 не может обновиться до IOS 8, так что проблема все равно одна. - person Fa11enAngel; 16.12.2014

Я только что протестировал различные настройки маршрутизатора и заметил, что iOS 7 НЕ пытается связаться с вышеупомянутыми сайтами/URL-адресами, когда поле DOMAIN маршрутизатора пусто.

Я предполагаю, что пустой домен указывает на настроенную сеть потребительского типа, и Apple не ожидает Captive Portal в такой сети. Если у вас есть доступ для администрирования вашего маршрутизатора, посмотрите, можете ли вы очистить поле DOMAIN (и перезапустить/повторно протестировать).

person AnalogThinker    schedule 20.11.2013
comment
Что вы имеете в виду, когда поле DOMAIN пусто. Пожалуйста, объясните это. - person Fa11enAngel; 17.05.2014

Я нашел свое решение своей проблемы. (некоторое время назад, но я снова нашел этот пост)

Сначала я узнал, iOS делает 3 вызова, первый для проверки, второй для получения страницы, которую нужно отобразить, третий для повторной проверки после загрузки страницы. Затем я обнаружил, что для каждого действия POST или GET, выполненного страницей, относительно исходной страницы было обновлено, iOS проверяет активное подключение к Интернету. Поскольку API facebook делает много вызовов, браузер начинает зависать (возможно, в сочетании с QoS на моем маршрутизаторе) и зависает страница.

Мое решение:

Поскольку я контролирую записи DNS используемого маршрутизатора, я перенаправил все домены на свой собственный сервер.

Сначала я сохранил запрос на проверку, чтобы позже идентифицировать пользователя, когда он вернется для третьего запроса.

Когда приходит второй запрос, я просто показываю информационное окно, в котором все правильно, и пользователь должен нажать кнопку «Готово».

Страница загружена, поэтому iOS снова проверяет, но я узнаю пользователя, поэтому я показываю код OK, который также отображает Apple. Кнопка «Готово» показывается, и у пользователя есть «интернет», согласно iOS.

На отображаемой странице я предлагаю пользователю открыть веб-браузер. Когда он это делает, он открывает страницу, и отображается мой портал с нужной страницей (я могу обнаружить это на основе агента браузера). Затем мой facebook API начинает делать свою работу, и мы идем :-)

Дайте мне знать, если кому-то нужна дополнительная информация о том, как обнаружить или, возможно, даже пример кода, если это необходимо.

Дополнительная информация. Чтобы захватить пользователя на вашем собственном сервере, перенаправляйте каждый запрос на вашу страницу обработки, используя, например, .htaccess. Запрос направляется в домен с подфайлом, например: http://captive.apple.com/getrT09Nx7G/YNrnUOulnDj/3cfrq3M40iR.html

Чтобы разделить нескольких пользователей, используйте уникальный URL-адрес, с которым устройство пытается связаться при проверке Интернета, в данном случае: /getYT09Nx7G/YN1nUOulnDj/3cfMq3M40iR.html.

person Cas Wolters    schedule 19.08.2014
comment
На отображаемой странице я предлагаю пользователю открыть веб-браузер. Как вы инструктируете пользователя сделать это? Знаете ли вы, как заставить пользователя переключиться на Safari iOS? например, нажав на ссылку. - person Loris Guignard; 09.04.2015
comment
Добавив ссылку с правильным целевым атрибутом, он откроет Safari (target=_blank) - person Cas Wolters; 10.04.2015
comment
К сожалению, я попробовал это и не могу заставить это работать, по крайней мере, на iOS 8.3. Мой PoC довольно прост: моя точка доступа Wi-Fi имеет правило iptable для прокси-трафика tcp для сценария nodejs. Этот сценарий позволяет нормально выполнять все запросы, за исключением тех, в которых пользовательский агент запускается с CaptiveNetworkSupport. В этом случае я изменяю ответ, чтобы вернуть простую веб-страницу со ссылкой target=_blank. При нажатии на эту ссылку пользователь перенаправляется на указанную страницу, но остается на Captive-портале и не открывает Safari. - person Loris Guignard; 10.04.2015
comment
Странно, я использую target=_blank, а как насчет target=_top ? - person Cas Wolters; 11.04.2015