¿Cómo me autentico en la red "abierta" de un proveedor inalámbrico sin usar un navegador?

13

Este tipo de configuración parece ser común en centros comerciales y aeropuertos. En el oeste de Canadá, Shaw ofrece dicho servicio y lo llama "Shaw Open". Estoy bastante seguro de que otros locales tienen servicios similares de proveedores como T-Mobile, etc.

Desde algo como un teléfono celular no es muy complicado de hacer. No es necesaria la autenticación para conectarse al punto de acceso wifi, ya que está "abierto" para el acceso público. Pero mi teléfono celular no se conectará a sitios web o servicios remotos a través de aplicaciones hasta que use mi navegador e inicie sesión en una página web particular proporcionada por el ISP .

Mi pregunta simplemente es: ¿Cómo automatizo el paso de autenticación desde un dispositivo que normalmente no tiene un navegador tradicional?

Tengo, en mi caso particular, una Raspberry Pi configurada con el software que quiero usar en ferias comerciales, etc. Estas ubicaciones tienen el mismo tipo de puntos de acceso "abiertos". El Raspi está destinado a ser autónomo. Simplemente hace sus negocios y habla con un sitio web. Pero esta conexión saliente está bloqueada por la conexión "abierta" de los ISP porque no lo he hecho, ni puedo completar la parte del navegador del proceso.

Suponiendo que tengo credenciales para hacer esto en la red de un proveedor en particular, ¿cómo puedo automatizar esa parte del proceso sin requerir que abra una sesión de terminal en el Pi? ¿Qué tipo de tecnología se utiliza aquí, que puedo buscar?

Pulpo
fuente
Suponiendo que su Pi tiene Linux, ¿tiene el wgetprograma instalado?
David Wilkins
1
Su pregunta no es realmente sobre Linux o Unix, sería mejor para Super User . Además, ¿hay alguna razón por la que no desea instalar un navegador en el pi? Siempre podría usar un navegador de línea de comandos simple basado en texto como, links2por ejemplo.
terdon
@terdon Mientras el Pi esté ejecutando Linux o alguna otra variante de Unix, la pregunta es perfectamente sobre el tema aquí. Por el contrario, no creo que el Pi sea una computadora de acuerdo con la definición de SU (pero no estoy seguro de eso, nunca he entendido esa definición ni la veo escrita en ningún lado).
Gilles 'SO- deja de ser malvado'
@Gilles sí, está en el tema, no voté para cerrar. Solo estaba sugiriendo que podría encajar mejor en SU. Y sí, las preguntas pi son bienvenidas allí.
terdon

Respuestas:

12

La clave para resolver problemas como este es saber cómo hacer la pregunta. Busqué en Google buscando "cómo acceder a panera bread wifi" y encontré esta joya.

Este artículo tenía varios scripts que podrían usarse para facilitar el inicio de sesión automático. Opté por incluir el ejemplo de Panera Bread que aprovecha la biblioteca Mechanize de Python.

La solución utiliza el dispatcher.ddirectorio de NetworkManager para ejecutar scripts cada vez que una interfaz de red en particular sube o baja. El artículo detalla una secuencia de comandos que colocaría en este directorio /etc/NetworkManager/dispatch.d, llamada 07-autologin_openwifi. Aquí está ese guión:

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

Y aquí está el script de pan 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 ---"

Le recomiendo que lea el artículo completo si está interesado en otros métodos para iniciar sesión automáticamente. El artículo tenía varias otras redes WiFi abiertas que estaban programadas para el área de Baltimore, MD.

slm
fuente
Esta podría ser la única solución, desafortunadamente requiere un poco de ingeniería inversa para determinar las URL y los campos de formulario para enviar para cada proveedor diferente, que por supuesto tiene sus propios desafíos, entre los cuales el desarrollador tiene que conocer a todos los proveedores posibles y tener acceso de primera mano a ellos; no necesariamente posible para mi escenario particular. Sin embargo, supongo que es lo mejor que puedo esperar. Por supuesto, la solución de cualquier proveedor podría romperse tan pronto como decidan actualizar sus formularios de autenticación web.
Octopus
1

Dependiendo de cómo se implemente la autenticación, es posible que pueda enviar una solicitud HTTP para obtener acceso. Sin embargo, esto depende de numerosos aspectos de la implementación particular.

Tenga en cuenta que estos tipos de autenticación se implementan para mantener los sistemas autónomos fuera y al mismo tiempo permitir que solo los navegadores tengan acceso, que es exactamente lo que está tratando de eludir.

Lo ideal sería tener un teléfono que pueda configurar como punto de acceso wifi y conectar su Pi a esa red para que pueda hacer lo que quiera, pero eso no es gratis.

TL; DR: Los mendigos no pueden elegir

David Wilkins
fuente
1
Si se realiza a través de un navegador, debe usar HTTP, por lo que esto es ciertamente posible. Sin embargo, dado que no existe un protocolo o estándar para este tipo de autenticación (AFAIK), tendría que implementar algo por proveedor. Lo cual será inútil si desea llevarlo a un lugar para el que no tiene una implementación. Iría con el punto de acceso telefónico; será gratuito si conecta el teléfono a la red abierta.
Ricitos de Oro
1

Aparentemente, estas redes con autenticación basada en la web dependen del control de acceso basado en MAC posterior a la autenticación, por lo que simplemente puede autenticarse en un dispositivo diferente mientras falsifica la dirección MAC de su Pi, y luego su Pi debería poder conectarse a la red.

Recibí este consejo de http://frankiejarrett.com/how-to-connect-apple-tv-to-a-hotel-wi-fi-network/

Picadillo
fuente
1

Si tiene un segundo dispositivo de red, puede configurar el reenvío NAT. Conéctese a su red "interna" con su teléfono celular o computadora portátil y haga que el RPi reenvíe esa conexión a la red en general. Luego autentíquese con el navegador en su computadora portátil o teléfono. La red ve la dirección MAC externa de su RPi y la asocia con la conexión autenticada.

Regularmente hago esto con un enrutador de bolsillo (antiguo AirPort Express) para conectarme a Internet del hotel, luego puedo conectar mi Chromecast y otros dispositivos a esa red sin tener que volver a autenticarme.

Aún más simple ... Si su dispositivo de red es USB y funciona con una computadora portátil, conéctelo a una computadora portátil e inicie sesión en la red. Luego vuelve a conectarlo al RPi. Debería funcionar durante varias horas.

Mike DeAngelo
fuente