Jak uwierzytelnić się w „otwartej” sieci dostawcy bezprzewodowego bez korzystania z przeglądarki?

13

Tego rodzaju konfiguracja wydaje się być powszechna w centrach handlowych i na lotniskach. W zachodniej Kanadzie Shaw zapewnia taką usługę i nazywa ją „Shaw Open”. Jestem prawie pewien, że inne lokalizacje mają podobne usługi od dostawców takich jak T-Mobile itp.

Z czegoś takiego jak telefon komórkowy nie jest to bardzo skomplikowane. Nie jest konieczne uwierzytelnianie, aby połączyć się z hotspotem Wi-Fi, ponieważ jest on „otwarty” dla publicznego dostępu. Ale mój telefon komórkowy nie łączy się ze stronami internetowymi ani zdalnymi usługami za pośrednictwem aplikacji, dopóki nie użyję przeglądarki i nie zaloguję się na określonej stronie internetowej dostarczonej przez dostawcę usług internetowych .

Moje proste pytanie brzmi: jak zautomatyzować krok uwierzytelniania na urządzeniu, które zazwyczaj nie ma tradycyjnej przeglądarki?

Mam, w moim szczególnym przypadku, raspberry Pi skonfigurowane z oprogramowaniem, którego chcę używać na targach itp. Lokalizacje te mają ten sam rodzaj „otwartych” hotspotów. Raspi ma być samodzielny. Po prostu robi interesy i rozmawia ze stroną internetową. Ale to połączenie wychodzące jest blokowane przez „otwarte” połączenie ISP, ponieważ nie udało mi się, ani nie mogę ukończyć przeglądarki w tym procesie.

Zakładając, że mam poświadczenia, aby to zrobić w sieci konkretnego dostawcy, jak mogę zautomatyzować tę część procesu bez konieczności otwierania sesji terminalu dla Pi? Jakiego rodzaju technologii tu nawet używam, którego mogę szukać?

Ośmiornica
źródło
Zakładając, że Twój Pi ma Linuksa, czy ma wgetzainstalowany program?
David Wilkins,
1
Twoje pytanie tak naprawdę nie dotyczy Linuksa ani Uniksa, lepiej pasowałoby do Super User . Ponadto, czy jest jakiś powód, dla którego nie chcesz instalować przeglądarki na pi? Zawsze możesz użyć prostej, tekstowej przeglądarki wiersza poleceń, links2na przykład.
terdon
@terdon Tak długo, jak Pi działa pod Linuksem lub innym wariantem Uniksa, pytanie jest tutaj doskonale na ten temat. I odwrotnie, nie sądzę, że Pi jest komputerem zgodnie z definicją SU (ale nie jestem tego pewien, nigdy nie zrozumiałem tej definicji ani nigdzie jej nie zapisałem).
Gilles 'SO - przestań być zły'
@Gilles tak, to na temat, nie głosowałem za zamknięciem. Właśnie sugerowałem, że może być lepiej dopasowany do SU. I tak, pytania pi są tam mile widziane.
terdon

Odpowiedzi:

12

Kluczem do rozwiązania takich problemów jest umiejętność zadania pytania. Przeszukałem Google, szukając „jak uzyskać dostęp do panera bread wifi” i znalazłem ten klejnot.

W tym artykule było kilka skryptów, które można wykorzystać do ułatwienia automatycznego logowania. Zdecydowałem się dołączyć przykład Panera Bread, który wykorzystuje bibliotekę Mechanize Pythona.

Rozwiązanie wykorzystuje katalog NetworkManagerdispatcher.d do uruchamiania skryptów za każdym razem, gdy określony interfejs sieciowy przechodzi w górę lub w dół. Artykuł szczegółowo opisuje skrypt, który należy umieścić w tym katalogu /etc/NetworkManager/dispatch.d, o nazwie 07-autologin_openwifi. Oto ten skrypt:

#!/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

A oto skrypt chleba 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 ---"

Zachęcam do zapoznania się z całym artykułem, jeśli interesują Cię inne metody automatycznego logowania. Artykuł zawierał kilka innych otwartych sieci WiFi, które zostały napisane w skrypcie dla obszaru Baltimore, MD.

slm
źródło
To może być jedyne rozwiązanie, niestety wymaga sporo inżynierii wstecznej, aby określić adresy URL i pola formularzy, które należy przesłać dla każdego innego dostawcy, który oczywiście ma swoje własne wyzwania, z których deweloper musi znać wszystkich możliwych dostawców i mieć dostęp do nich z pierwszej ręki; niekoniecznie możliwe w moim konkretnym scenariuszu. Myślę jednak, że to najlepsze, czego mogę się spodziewać. Oczywiście każde rozwiązanie jednego dostawcy może ulec awarii, gdy tylko zdecydują się zaktualizować swoje formularze uwierzytelniania internetowego.
Ośmiornica
1

W zależności od sposobu implementacji uwierzytelnienia może być możliwe wysłanie żądania HTTP w celu uzyskania dostępu. Zależy to jednak od wielu aspektów konkretnego wdrożenia.

Należy pamiętać, że tego rodzaju uwierzytelnianie wprowadzono, aby oddzielić autonomiczne systemy, a jednocześnie umożliwić dostęp tylko przeglądarkom - właśnie tego próbujesz obejść.

Idealnie byłoby mieć telefon, który można skonfigurować jako hotspot Wi-Fi i podłączyć swój Pi do tej sieci, abyś mógł robić, co chcesz, ale to nie jest darmowe.

TL; DR: Żebraki nie mogą wybierać

David Wilkins
źródło
1
Jeśli odbywa się to za pomocą przeglądarki, musi korzystać z protokołu HTTP, więc z pewnością jest to możliwe. Ponieważ jednak nie ma protokołu ani standardu dla tego rodzaju uwierzytelniania (AFAIK), należy zaimplementować coś dla każdego dostawcy. Co będzie bezużyteczne, jeśli chcesz zabrać go w miejsce, w którym nie masz implementacji. Wybrałbym hotspot telefoniczny - będzie darmowy, jeśli podłączysz telefon do otwartej sieci.
goldilocks,
1

Najwyraźniej te sieci z uwierzytelnianiem internetowym opierają się na ponownym uwierzytelnieniu kontroli dostępu opartym na MAC, więc możesz po prostu uwierzytelnić się na innym urządzeniu, podszywając się pod adres MAC twojego Pi, a wtedy Twoje Pi powinno być w stanie uzyskać dostęp do sieci.

Dostałem tę wskazówkę od http://frankiejarrett.com/how-to-connect-apple-tv-to-a-hotel-wi-fi-network/

Haszysz
źródło
1

Jeśli masz drugie urządzenie sieciowe, możesz skonfigurować przekazywanie NAT. Połącz się z „wewnętrzną” siecią za pomocą telefonu komórkowego lub laptopa i poproś RPi o przekazanie tego połączenia do całej sieci. Następnie uwierzytelnij się za pomocą przeglądarki na swoim laptopie lub telefonie. Sieć widzi zewnętrzny adres MAC twojego RPi i kojarzy go z uwierzytelnionym połączeniem.

Regularnie robię to z kieszonkowym routerem podróżnym (stary AirPort Express), aby połączyć się z hotelowym Internetem, a następnie mogę podłączyć Chromecasta i inne urządzenia do tej sieci bez konieczności ponownego uwierzytelniania.

Jeszcze prostsze ... Jeśli twoje urządzenie sieciowe jest usb i działa z laptopem, podłącz je do laptopa i zaloguj się do sieci. Następnie podłącz go ponownie do RPi. Powinien działać przez kilka godzin.

Mike DeAngelo
źródło