Як здійснити автентифікацію на "відкриту" мережу провайдера бездротового зв'язку без використання браузера?


13

Подібне налаштування, здається, є звичайним у торгових центрах та аеропортах. У Західній Канаді Shaw надає таку послугу і називає її "Shaw Open". Я впевнений, що в інших регіонах є подібні послуги від провайдерів, таких як T-Mobile тощо.

З чогось такого, як мобільний телефон, це зробити не дуже складно. Для підключення до точки доступу до wifi не потрібно проводити автентифікацію, оскільки вона "відкрита" для загальнодоступного доступу. Але мій мобільний телефон не підключатиметься до веб-сайтів чи віддалених служб через додатки, поки я не використовую свій браузер і не ввійду на певну веб-сторінку, надану провайдером .

На моє запитання було сказано просто: Як я автоматизую крок аутентифікації з пристрою, який зазвичай не має традиційного браузера?

У моєму конкретному випадку є малиновий Pi, налаштований на програмне забезпечення, яке я хочу використовувати на виставках і т.д. Распі має на увазі бути самодостатнім. Він просто займається бізнесом і спілкується з веб-сайтом. Але це вихідне з'єднання блокується "відкритим" з'єднанням Інтернет-провайдерів, оскільки я не маю і не можу завершити браузерну частину процесу.

Якщо припустити, що у мене є дані для цього в мережі певного провайдера, як я можу автоматизувати цю частину процесу, не вимагаючи від мене відкривати термінальну сесію для Pi? Яку технологію тут навіть використовують, яку я можу шукати?


Якщо припустимо, що у Pi є Linux, чи wgetвстановлена ​​програма?
Девід Уілкінс

1
Ваше питання стосується насправді не Linux або Unix, це було б краще підходити для Super User . Крім того, чи є причина, що ви не хочете встановлювати браузер на пі? Ви завжди можете використовувати простий текстовий браузер командного рядка, як, links2наприклад.
тердон

@terdon Поки Pi працює Linux або якийсь інший варіант Unix, питання тут абсолютно ідеально. І навпаки, я не думаю, що Pi - це комп’ютер за визначенням SU (але я не впевнений у цьому, я ніколи не розумів цього визначення і не бачив його ніде записаним).
Жил "ТАК - перестань бути злим"

@Gilles так, це на тему, я не голосував, щоб закрити. Я просто припускав, що це може бути краще для SU. І так, питання пі вітаються там.
тердон

Відповіді:


12

Ключовим фактором для вирішення таких проблем, як це - знати, як поставити питання. Я шукав Google, шукаючи "як отримати доступ до wifi panera хліба" і знайшов цю дорогоцінну каменю.

У цій статті було кілька сценаріїв, які можна використовувати для полегшення автоматичного входу в систему. Я вирішив включити приклад для Panera Bread, який використовує бібліотеку Mechanize Python's 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, які були написані для області Балтимор, штат Мерія.


Це може бути єдиним рішенням, але, на жаль, потрібен неабиякий зворотний інжиніринг для визначення URL-адрес та полів форми для подання для кожного іншого постачальника, що, звичайно, має свої виклики, не найменші з яких розробник повинен знати всіх можливих постачальників і мати доступ до них з першої руки; це не обов'язково можливо для мого конкретного сценарію. Я думаю, це приблизно найкраще, що я можу очікувати. Звичайно, рішення будь-якого постачальника може порушитися, як тільки він вирішить оновити форми веб-автентифікації.
Восьминіг

1

Залежно від способу автентифікації, ви можете надіслати HTTP-запит, щоб отримати доступ. Однак це залежить від численних аспектів конкретної реалізації.

Пам’ятайте, що ці типи аутентифікації встановлюються для запобігання доступу до автономних систем, дозволяючи доступу лише до браузерів, що саме ви намагаєтесь обійти.

В ідеалі, у вас є телефон, який ви можете налаштувати як точку доступу до wifi і підключити свій Pi до тієї мережі, щоб ви могли робити все, що завгодно, але це не безкоштовно.

TL; DR: жебраки не можуть бути обраними


1
Якщо це робиться через браузер, він повинен використовувати HTTP, тому це, безумовно, можливо. Однак, оскільки для цього виду аутентифікації (AFAIK) немає жодного протоколу чи стандарту, вам доведеться щось реалізовувати для кожного постачальника. Що буде марно, якщо ви захочете взяти його кудись, у вас немає реалізації. Я б поїхав із телефонною точкою доступу - це буде безкоштовно, якщо ви підключите телефон до відкритої мережі.
золотинки

1

Мабуть, ці мережі з веб-авторизацією розраховують на пост-аутентифікацію управління доступом на основі MAC, тому ви можете просто пройти автентифікацію на іншому пристрої, підробляючи MAC-адресу Вашого Пі, і тоді ваш 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. Це повинно працювати кілька годин.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.