Как пройти аутентификацию в «открытой» сети оператора беспроводной связи без использования браузера?

13

Такая установка, кажется, распространена в торговых центрах и аэропортах. В Западной Канаде Shaw предоставляет такую ​​услугу и называет ее «Shaw Open». Я уверен, что в других регионах есть аналогичные услуги от таких провайдеров, как T-Mobile и т. Д.

С чем-то вроде мобильного телефона это сделать не очень сложно. Для подключения к точке доступа Wi-Fi аутентификация не требуется, поскольку она «открыта» для публичного доступа. Но мой мобильный телефон не будет подключаться к веб-сайтам или удаленным службам через приложения, пока я не использую свой браузер и не войду на определенную веб-страницу, предоставленную интернет-провайдером .

Мой простой вопрос: как мне автоматизировать этап аутентификации с устройства, которое обычно не имеет традиционного браузера?

В моем конкретном случае у меня Raspberry Pi настроен с программным обеспечением, которое я хочу использовать на выставках и т. Д. В этих местах есть такие же «открытые» точки доступа. Распи должен быть самодостаточным. Он просто делает свое дело и разговаривает с сайтом. Но это исходящее соединение блокируется «открытым» соединением интернет-провайдера, потому что я не имею и не могу выполнить часть процесса, связанную с браузером.

Предполагая, что у меня есть учетные данные для этого в сети конкретного провайдера, как я могу автоматизировать эту часть процесса, не требуя от меня открыть сеанс терминала для Pi? Какую технологию здесь даже используют, которую я могу искать?

Осьминог
источник
Предполагая, что у вашего Пи есть Linux, wgetустановлена ​​ли программа?
Дэвид Уилкинс
1
Ваш вопрос на самом деле не о Linux или Unix, он лучше подошел бы для Super User . Кроме того, есть ли причина, по которой вы не хотите устанавливать браузер на пи? Вы всегда можете использовать простой текстовый браузер командной строки, links2например.
Тердон
@terdon Пока Pi работает под управлением Linux или какого-либо другого варианта Unix, вопрос здесь совершенно актуален. И наоборот, я не думаю, что Pi - это компьютер в соответствии с определением SU (но я не уверен в этом, я никогда не понимал это определение и не видел его записанным где-либо).
Жиль "ТАК - перестань быть злым"
@ Жиль да, это по теме, я не голосовал, чтобы закрыть. Я просто предположил, что это может быть лучше подходит для SU. И да, пи вопросы там приветствуются.
Terdon

Ответы:

12

Ключ к решению таких проблем - это умение задать вопрос. Я искал Google в поисках "как получить доступ к panera bread wifi" и обнаружил этот драгоценный камень.

В этой статье было несколько сценариев, которые можно использовать для упрощения автоматического входа в систему. Я решил включить пример для Panera Bread, который использует библиотеку Python Mechanize.

Это решение использует каталог NetworkManagerdispatcher.d для запуска сценариев всякий раз, когда конкретный сетевой интерфейс работает вверх или вниз. В статье подробно описан сценарий , который вы бы разместить в этом каталоге /etc/NetworkManager/dispatch.d, называется 07-autologin_openwifi. Вот этот скрипт:

#!/bin/bash
#------------------------------
# By Fahad Alduraibi
# Last update: June 12, 2012
# Version: 1.1
#------------------------------

export LC_ALL=C
LogFile="/var/log/07-WIFI_ACCESS.log"

# The parameters that get passed to the script are:
# $1 = The interface name ( eth0, wlan0 ...etc)
# $2 = Interface status ( "up" or "down" )

# Check if wireless status is up
# I have two wifi cards in my laptop, named "wlan0 and wlan1"
# so I use regular expression "wlan[01]" to match both of them.
if [[ "$1" =~ wlan[01] && $2 == "up" ]]; then

    # Get the network name from "iwconfig" or (can also locate the network based on IP or MAC address if needed)
    ESSID=$(/sbin/iwconfig $1 | grep ESSID | cut -d'"' -f2)

    # Record the date and time for debugging purposes only
    echo "[`date`] ESSID=($ESSID)" >> $LogFile

    # If the wireless name matches then run its python script
    if [[ "$ESSID" == "BCPL-PUBLIC-WIFI" ]]; then
        /usr/bin/python /myscripts/baltimore-county_library_wifi.py 1>> $LogFile 2>&1
    elif [[ "$ESSID" == "PANERA" ]]; then
        /usr/bin/python /myscripts/panera.py 1>> $LogFile 2>&1
    elif [[ "$ESSID" == "Nordstrom_Wi-Fi" ]]; then
        /usr/bin/python /myscripts/nordstrom.py 1>> $LogFile 2>&1
    #elif .... (you can add more open wifi here)

    fi
fi

#if [[ "$1" =~ wlan[01] && $2 == "down" ]]; then
    ##If you want to do somehting when the network is down
#fi

А вот сценарий с хлебом Panera panera.py:

#------------------------------
# By Fahad Alduraibi
# Last update: June 12, 2012
# Version: 1.1
#------------------------------
import mechanize
import sys

br = mechanize.Browser()
br.set_handle_equiv(True)
#br.set_handle_gzip(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20100101 Firefox/13.0')]

testURL = 'http://fadvisor.net/blog/'
response = br.open(testURL)

if response.geturl() == testURL:
  print "FAD: You are already logged in to Panera."
  sys.exit()

try:
  forms = mechanize.ParseResponse(response, backwards_compat=False)
except:
  print "FAD: Error in parsing forms, Am I already logged in to Panera?"
  sys.exit()

response.close

form = forms[0]
#print form
#print "----------------------------------- Login"
request = form.click()
response = mechanize.urlopen(request)
forms = mechanize.ParseResponse(response, backwards_compat=False)
response.close()

form = forms[0]
#print form
#print "----------------------------------- Validate"
#print
request = form.click()
response = mechanize.urlopen(request)
forms = mechanize.ParseResponse(response, backwards_compat=False)
response.close()

form = forms[0]
#print form
#print "----------------------------------- ConfirmLogin New"
#print
request = form.click()
response = mechanize.urlopen(request)
forms = mechanize.ParseResponse(response, backwards_compat=False)
response.close()

form = forms[0]
#print form
#print "----------------------------------- ConfirmLogin Validate"
#print
request = form.click()
response = mechanize.urlopen(request)
forms = mechanize.ParseResponse(response, backwards_compat=False)
response.close()

form = forms[0]
#print form
#print "----------------------------------- CompleteLogin New"
#print

request = form.click()
response = mechanize.urlopen(request)
forms = mechanize.ParseResponse(response, backwards_compat=False)
response.close()

form = forms[0]
#print form
#print "----------------------------------- HttpLoginRequest"
#print

request = form.click()
response = br.open(request)
#print response.read()

response.close()
print "--- Panera Done ---"

Я рекомендую вам прочитать всю статью, если вы заинтересованы в других методах автоматического входа в систему. В статье было несколько других открытых сетей WiFi, которые были созданы для Балтимора, штат Мэриленд.

SLM
источник
Возможно, это единственное решение, к сожалению, для определения URL-адресов и полей формы, которые необходимо отправить для каждого отдельного поставщика, требуется немало обратного инжиниринга, что, конечно, имеет свои собственные проблемы, не в последнюю очередь разработчик должен знать всех возможных поставщиков и иметь доступ из первых рук к ним; не обязательно возможно для моего конкретного сценария. Я полагаю, что это лучшее из того, что я могу ожидать. Конечно, любое решение провайдера может сломаться, как только они решат обновить свои формы веб-аутентификации.
Осьминог
1

В зависимости от того, как реализована аутентификация, вы можете отправить HTTP-запрос для получения доступа. Это зависит от многочисленных аспектов конкретной реализации, хотя.

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

В идеале у вас должен быть телефон, который вы можете настроить как точку доступа Wi-Fi и подключить свой Pi к этой сети, чтобы вы могли делать все, что захотите, но это не бесплатно.

TL; DR: нищие не могут быть выбирающими

Дэвид Уилкинс
источник
1
Если это делается через браузер, он должен использовать HTTP, так что это, безусловно, возможно. Однако, поскольку нет протокола или стандарта для такого рода аутентификации (AFAIK), вам придется реализовать что-то для каждого провайдера. Что будет бесполезно, если вы захотите взять его где-то, для чего у вас нет реализации. Я бы пошел с точки доступа телефона - это будет бесплатно, если вы подключите телефон к открытой сети.
Златовласка
1

Очевидно, что эти сети с веб-аутентификацией основаны на пост-аутентификации управления доступом на основе MAC-адреса, поэтому вы можете просто выполнить аутентификацию на другом устройстве, подделывая MAC-адрес вашего Pi, и тогда ваш Pi сможет подключиться к сети.

Получил этот совет от http://frankiejarrett.com/how-to-connect-apple-tv-to-a-hotel-wi-fi-network/

гашиш
источник
1

Если у вас есть второе сетевое устройство, вы можете настроить переадресацию NAT. Подключитесь к своей «внутренней» сети с помощью мобильного телефона или ноутбука, и RPi переадресует это подключение к сети в целом. Затем авторизуйтесь с помощью браузера на вашем ноутбуке или телефоне. Сеть видит внешний MAC-адрес вашего RPi и связывает его с аутентифицированным соединением.

Я регулярно делаю это с карманным туристическим маршрутизатором (старый AirPort Express) для подключения к интернету отеля, затем я могу подключить Chromecast и другие устройства к этой сети без повторной аутентификации.

Еще проще ... Если ваше сетевое устройство USB и работает с ноутбуком, подключите его к ноутбуку и войдите в сеть. Затем подключите его к RPi. Это должно работать в течение нескольких часов.

Майк ДеАнджело
источник