Come faccio ad autenticarmi sulla rete "aperta" di un provider wireless senza usare un browser?


13

Questo tipo di installazione sembra essere comune nei centri commerciali e negli aeroporti. Nel Canada occidentale Shaw fornisce un tale servizio e lo chiama "Shaw Open". Sono abbastanza sicuro che altri locali abbiano servizi simili da fornitori come T-Mobile, ecc.

Da qualcosa come un telefono cellulare non è molto complicato da fare. Non è necessaria alcuna autenticazione per connettersi all'hotspot wifi poiché è "aperto" per l'accesso pubblico. Ma il mio cellulare non si connetterà a siti Web o servizi remoti tramite app fino a quando non utilizzo il browser e accedo a una determinata pagina Web fornita dall'ISP .

La mia domanda è semplicemente: come automatizzare il passaggio di autenticazione da un dispositivo che in genere non ha un browser tradizionale?

Ho, nel mio caso particolare, un raspberry Pi configurato con software che voglio usare in occasione di fiere ecc. Queste sedi hanno lo stesso tipo di hotspot "aperti". Il Raspi è pensato per essere autonomo. Fa solo i suoi affari e parla con un sito web. Ma questa connessione in uscita è bloccata dalla connessione "aperta" degli ISP perché non ho, né posso completare la parte del browser del processo.

Supponendo che io abbia le credenziali per farlo sulla rete di un determinato fornitore, come posso automatizzare quella parte del processo senza richiedere che io apra una sessione terminale al Pi? Che tipo di tecnologia viene persino utilizzata qui, che posso cercare?


Supponendo che il tuo Pi abbia Linux, il wgetprogramma è installato?
David Wilkins,

1
La tua domanda non riguarda davvero Linux o Unix, si adatterebbe meglio a Super User . Inoltre, c'è qualche motivo per cui non vuoi installare un browser sul pi? Potresti sempre usare un semplice browser da riga di comando basato su testo come links2ad esempio.
terdon

@terdon Fintanto che il Pi esegue Linux o qualche altra variante Unix, la domanda è perfettamente in argomento qui. Al contrario, non penso che il Pi sia un computer secondo la definizione di SU (ma non ne sono sicuro, non ho mai capito quella definizione e non l'ho mai scritta da nessuna parte).
Gilles 'SO- smetti di essere malvagio' il

@Gilles sì, è in tema, non ho votato per chiudere. Stavo solo suggerendo che potrebbe adattarsi meglio a SU. E sì, le domande più sono benvenute lì.
terdon

Risposte:


12

La chiave per risolvere problemi come questo è sapere come porre la domanda. Ho cercato Google cercando "come accedere a panera bread wifi" e ho trovato questo gioiello.

Questo articolo aveva diversi script che potevano essere usati per facilitare l'accesso automatico. Ho scelto di includere l'esempio per Panera Bread che sfrutta la libreria Mechanize di Python.

La soluzione utilizza la dispatcher.ddirectory di NetworkManager per eseguire script ogni volta che una particolare interfaccia di rete va su o giù. L'articolo descrive in dettaglio uno script da inserire in questa directory /etc/NetworkManager/dispatch.d, chiamato 07-autologin_openwifi. Ecco quello script:

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

Ed ecco la sceneggiatura del pane 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 ---"

Ti incoraggio a leggere l'intero articolo se sei interessato ad altri metodi per eseguire l'accesso automatico. L'articolo aveva diverse altre reti WiFi aperte che erano state programmate per l'area di Baltimora, MD.


Questa potrebbe essere l'unica soluzione, sfortunatamente richiede un bel po 'di reverse engineering per determinare gli URL e i campi dei moduli da inviare per ogni diverso fornitore che ovviamente ha le sue sfide, non da ultimo lo sviluppatore deve conoscere tutti i possibili fornitori e avere accesso diretto a loro; non necessariamente possibile per il mio scenario particolare. Immagino che sia il meglio che mi possa aspettare, però. Naturalmente, la soluzione di un fornitore potrebbe interrompersi non appena decidono di aggiornare i loro moduli di autenticazione web.
Polpo,

1

A seconda dell'implementazione dell'autenticazione, potresti essere in grado di inviare una richiesta HTTP per ottenere l'accesso. Ciò dipende tuttavia da numerosi aspetti dell'implementazione particolare.

Tieni presente che questi tipi di autenticazione sono messi in atto per tenere fuori i sistemi autonomi, consentendo l'accesso solo ai browser, che è esattamente ciò che stai cercando di eludere.

Idealmente, avresti un telefono che puoi configurare come hotspot wifi e connettere il tuo Pi a quella rete in modo da poter fare quello che vuoi, ma non è gratuito.

TL; DR: i mendicanti non possono essere selettori


1
Se è fatto tramite un browser, deve usare HTTP, quindi questo è certamente possibile. Tuttavia, poiché non esiste un protocollo o uno standard per questo tipo di autenticazione (AFAIK), dovresti implementare qualcosa per provider. Il che sarà inutile se vuoi portarlo da qualche parte per cui non hai un'implementazione. Andrei con l'hotspot del telefono - sarà gratuito se colleghi il telefono alla rete aperta.
Riccioli d'oro

1

Apparentemente queste reti con autenticazione basata sul web si basano sulla post-autenticazione del controllo degli accessi basata su MAC, quindi puoi semplicemente autenticarti su un dispositivo diverso mentre esegui lo spoofing dell'indirizzo MAC del tuo Pi e quindi il tuo Pi dovrebbe essere in grado di accedere alla rete.

Ho ricevuto questo consiglio da http://frankiejarrett.com/how-to-connect-apple-tv-to-a-hotel-wi-fi-network/


1

Se si dispone di un secondo dispositivo di rete, è possibile impostare l'inoltro NAT. Collegati alla tua rete "interna" con il tuo cellulare o laptop e fai in modo che RPi inoltri tale connessione alla rete in generale. Quindi autenticati con il browser sul tuo laptop o telefono. La rete vede l'indirizzo MAC esterno del tuo RPi e lo associa alla connessione autenticata.

Lo faccio regolarmente con un router da viaggio tascabile (vecchio AirPort Express) per connettermi a Internet dell'hotel, quindi posso collegare il mio Chromecast e altri dispositivi a quella rete senza dover eseguire nuovamente l'autenticazione.

Ancora più semplice ... Se il dispositivo di rete è USB e funziona con un laptop, collegalo a un laptop e accedi alla rete. Quindi ricollegalo a RPi. Dovrebbe funzionare per diverse ore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.