Comment m'authentifier auprès du réseau «ouvert» d'un fournisseur de services sans fil sans utiliser de navigateur?

13

Ce type de configuration semble être courant dans les centres commerciaux et les aéroports. Dans l'Ouest canadien, Shaw fournit un tel service et l'appelle «Shaw Open». Je suis presque sûr que d'autres sites ont des services similaires de fournisseurs tels que T-Mobile, etc.

À partir de quelque chose comme un téléphone portable, ce n'est pas très compliqué à faire. Aucune authentification n'est nécessaire pour se connecter au hotspot wifi car il est "ouvert" pour un accès public. Mais mon téléphone portable ne se connectera pas à des sites Web ou à des services à distance via des applications jusqu'à ce que j'utilise mon navigateur et que je me connecte à une page Web particulière fournie par le FAI .

Ma question est simplement la suivante: comment automatiser l'étape d'authentification à partir d'un appareil qui ne dispose généralement pas d'un navigateur traditionnel?

J'ai, dans mon cas particulier, un Raspberry Pi configuré avec un logiciel que je veux utiliser lors de salons, etc. Ces emplacements ont le même type de hotspots "ouverts". Le Raspi est censé être autonome. Il fait juste ses affaires et parle à un site Web. Mais cette connexion sortante est bloquée par la connexion «ouverte» des FAI car je ne l'ai pas fait et je ne peux pas terminer la partie navigateur du processus.

En supposant que j'ai des informations d'identification pour le faire sur le réseau d'un fournisseur particulier, comment puis-je automatiser cette partie du processus sans m'obliger à ouvrir une session de terminal sur le Pi? Quel type de technologie est même utilisé ici, que je peux rechercher?

Poulpe
la source
En supposant que votre Pi a Linux, le wgetprogramme est-il installé?
David Wilkins
1
Votre question ne concerne pas vraiment Linux ou Unix, elle conviendrait mieux à Super User . De plus, y a-t-il une raison pour laquelle vous ne souhaitez pas installer de navigateur sur le pi? Vous pouvez toujours utiliser un simple navigateur de ligne de commande basé sur du texte comme links2par exemple.
terdon
@terdon Tant que le Pi exécute Linux ou une autre variante Unix, la question est parfaitement d'actualité ici. Inversement, je ne pense pas que le Pi soit un ordinateur selon la définition de SU (mais je n'en suis pas sûr, je n'ai jamais compris cette définition ni la voir écrite nulle part).
Gilles 'SO- arrête d'être méchant'
@Gilles oui, c'est sur le sujet, je n'ai pas voté pour fermer. Je suggérais simplement que cela pourrait être mieux adapté à SU. Et oui, les questions pi y sont les bienvenues.
terdon

Réponses:

12

La clé pour résoudre des problèmes comme celui-ci est de savoir comment poser la question. J'ai cherché sur Google à la recherche de "comment accéder au pain panera wifi" et j'ai trouvé ce joyau.

Cet article avait plusieurs scripts qui pourraient être utilisés pour faciliter la connexion automatique. J'ai choisi d'inclure l'exemple de Panera Bread qui exploite la bibliothèque Mechanize de Python.

La solution utilise le dispatcher.drépertoire de NetworkManager pour exécuter des scripts chaque fois qu'une interface réseau particulière monte ou descend. L'article détaille un script que vous placeriez dans ce répertoire /etc/NetworkManager/dispatch.d, appelé 07-autologin_openwifi. Voici ce 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

Et voici le script pain 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 ---"

Je vous encourage à lire l'intégralité de l'article si vous êtes intéressé par d'autres méthodes pour effectuer la connexion automatique. L'article avait plusieurs autres réseaux WiFi ouverts qui ont été scriptés pour la région de Baltimore, MD.

slm
la source
Cela pourrait être la seule solution, malheureusement, cela nécessite un peu d'ingénierie inverse pour déterminer les URL et les champs de formulaire à soumettre pour chaque fournisseur différent, ce qui a bien sûr ses propres défis, dont le développeur doit connaître tous les fournisseurs possibles et avoir accès direct à eux; pas nécessairement possible pour mon scénario particulier. Je suppose que c'est à peu près le meilleur que je puisse attendre. Bien sûr, la solution d'un fournisseur peut se casser dès qu'il décide de mettre à jour ses formulaires d'authentification Web.
Octopus
1

Selon la façon dont l'authentification est implémentée, vous pourrez peut-être envoyer une demande HTTP pour y accéder. Cela dépend cependant de nombreux aspects de la mise en œuvre particulière.

Gardez à l'esprit que ces types d'authentification sont mis en place pour empêcher l'accès aux systèmes autonomes tout en n'autorisant que les navigateurs, ce qui est exactement ce que vous essayez de contourner.

Idéalement, vous auriez un téléphone que vous pouvez configurer comme point d'accès wifi et connecter votre Pi à ce réseau afin que vous puissiez faire ce que vous voulez, mais ce n'est pas gratuit.

TL; DR: les mendiants ne peuvent pas être des sélecteurs

David Wilkins
la source
1
Si cela se fait via un navigateur, il doit utiliser HTTP, c'est donc certainement possible. Cependant, puisqu'il n'y a pas de protocole ou de norme pour ce type d'authentification (AFAIK), vous devez implémenter quelque chose par fournisseur. Ce qui sera inutile si vous voulez l'emmener quelque part pour lequel vous n'avez pas d'implémentation. J'irais avec le point d'accès téléphonique - ce sera gratuit si vous connectez le téléphone au réseau ouvert.
goldilocks
1

Apparemment, ces réseaux avec authentification basée sur le Web reposent sur une post-authentification de contrôle d'accès basée sur MAC, vous pouvez donc simplement vous authentifier sur un autre appareil tout en usurpant l'adresse MAC de votre Pi, puis votre Pi devrait pouvoir accéder au réseau.

J'ai eu cette astuce sur http://frankiejarrett.com/how-to-connect-apple-tv-to-a-hotel-wi-fi-network/

Hacher
la source
1

Si vous avez un deuxième périphérique réseau, vous pouvez configurer le transfert NAT. Connectez-vous à votre réseau "interne" avec votre téléphone portable ou votre ordinateur portable et demandez au RPi de transmettre cette connexion au réseau dans son ensemble. Authentifiez-vous ensuite avec le navigateur de votre ordinateur portable ou de votre téléphone. Le réseau voit l'adresse MAC externe de votre RPi et l'associe à la connexion authentifiée.

Je le fais régulièrement avec un routeur de voyage de poche (ancien AirPort Express) pour me connecter à Internet de l'hôtel, puis je peux connecter mon Chromecast et d'autres appareils à ce réseau sans avoir à me réauthentifier.

Encore plus simple ... Si votre périphérique réseau est USB et fonctionne avec un ordinateur portable, connectez-le à un ordinateur portable et connectez-vous au réseau. Reconnectez-le ensuite au RPi. Cela devrait fonctionner pendant plusieurs heures.

Mike DeAngelo
la source