Como eu me autentico na rede “aberta” de um provedor sem usar um navegador?

12

Esse tipo de configuração parece ser comum em shoppings e aeroportos. No oeste do Canadá, a Shaw fornece esse serviço e o chama de "Shaw Open". Tenho certeza que outras localidades têm serviços similares de provedores como T-Mobile, etc.

De algo como um telefone celular não é muito complicado de se fazer. Nenhuma autenticação é necessária para se conectar ao ponto de acesso Wi-Fi, pois é "aberto" para acesso público. Mas meu celular não se conecta a sites ou serviços remotos por meio de aplicativos até que eu use meu navegador e faça login em uma determinada página da web fornecida pelo ISP .

Minha pergunta é: Como automatizar a etapa de autenticação em um dispositivo que normalmente não tem um navegador tradicional?

Eu tenho, no meu caso particular, um raspberry Pi configurado com software que eu quero usar em feiras etc. Esses locais têm o mesmo tipo de pontos de acesso "abertos". O Raspi destina-se a ser independente. Apenas faz o seu negócio e fala com um site. Mas essa conexão de saída é bloqueada pela conexão "aberta" do ISP porque não o fiz, nem posso completar a parte do navegador do processo.

Supondo que eu tenha credenciais para fazer isso na rede de um determinado provedor, como posso automatizar essa parte do processo sem exigir que eu abra uma sessão de terminal para o Pi? Que tipo de tecnologia é mesmo usado aqui, que eu posso procurar?

    
por Octopus 05.03.2014 / 18:36

4 respostas

11

A chave para resolver problemas como este é saber como fazer a pergunta. Eu procurei no Google procurando "como acessar panera bread wifi" e descobri essa jóia.

Este artigo tinha vários scripts que poderiam ser usados para facilitar o login automático. Eu optei por incluir o exemplo do Panera Bread, que aproveita a biblioteca Mechanize do Python.

A solução faz uso do diretório dispatcher.d do NetworkManager para executar scripts sempre que uma determinada interface de rede for ativada ou para baixo. O artigo detalha um script que você colocaria nesse diretório, /etc/NetworkManager/dispatch.d , chamado 07-autologin_openwifi . Aqui está esse 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

E aqui está o script de pão 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 ---"

Recomendo que você leia todo o artigo se estiver interessado em outros métodos para fazer o login automático. O artigo tinha várias outras redes Wi-Fi abertas que foram criadas para a área de Baltimore, MD.

    
por 05.03.2014 / 22:49
1

Dependendo de como a autenticação é implementada, você pode enviar uma solicitação HTTP para obter acesso. Isso depende de vários aspectos da implementação específica.

Tenha em mente que esses tipos de autenticação são colocados em prática para manter os sistemas autônomos fora, permitindo que apenas os navegadores tenham acesso, o que é exatamente o que você está tentando contornar.

O ideal é que você tenha um telefone que possa ser configurado como um hotspot Wi-Fi e conecte seu Pi a essa rede para poder fazer o que quiser, mas isso não é gratuito.

TL; DR: Mendigos não podem escolher

    
por 05.03.2014 / 18:57
1

Aparentemente, essas redes com autenticação baseada na web dependem de pós-autenticação de controle de acesso baseado em MAC, para que você possa simplesmente autenticar em um dispositivo diferente falsificando o endereço MAC do Pi e, em seguida, seu Pi possa entrar na rede.

Adquira esta dica de link

    
por 01.07.2015 / 18:37
1

Se você tiver um segundo dispositivo de rede, poderá configurar o encaminhamento de NAT. Conecte-se à sua rede "interna" com seu celular ou laptop e faça o RPi encaminhar essa conexão à rede como um todo. Em seguida, autentique-se com o navegador no seu laptop ou telefone. A rede vê o endereço MAC externo do seu RPi e associa isso à conexão autenticada.

Eu faço isso regularmente com um roteador de viagens de bolso (antigo AirPort Express) para me conectar à internet do hotel e, depois, posso conectar meu Chromecast e outros dispositivos a essa rede sem precisar autenticar novamente.

Ainda mais simples ... Se o seu dispositivo de rede for usb e funcionar com um laptop, conecte-o a um laptop e faça login na rede. Em seguida, reconecte-o ao RPi. Deve funcionar por várias horas.

    
por 01.06.2016 / 21:08