Como me autentico na rede "aberta" de um provedor sem fio sem usar um navegador?

13

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 de que outros locais têm serviços semelhantes de provedores como a T-Mobile etc.

De algo como um telefone celular, não é muito complicado de fazer. Nenhuma autenticação é necessária para conectar-se ao hotspot wifi, pois é "aberto" para acesso público. Mas meu telefone celular não se conectará a sites ou serviços remotos por aplicativos até que eu use meu navegador e entre em uma página específica fornecida pelo ISP .

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

Eu tenho, no meu caso particular, um raspberry Pi configurado com o software que eu quero usar em feiras, etc. Esses locais têm o mesmo tipo de pontos ativos "abertos". O Raspi é para ser independente. Ele apenas faz seus negócios e conversa com um site. Mas essa conexão de saída é bloqueada pela conexão "aberta" dos ISPs porque não o tenho, nem posso concluir a parte do processo do navegador.

Supondo que eu tenha credenciais para fazer isso na rede de um provedor específico, como posso automatizar essa parte do processo sem exigir que eu abra uma sessão de terminal no Pi? Que tipo de tecnologia é usada aqui, que eu posso pesquisar?

Polvo
fonte
Supondo que seu Pi tenha Linux, ele possui o wgetprograma instalado?
David Wilkins
1
Sua pergunta não é realmente sobre Linux ou Unix, seria melhor para o Superusuário . Além disso, existe algum motivo para você não querer instalar um navegador no pi? Você sempre pode usar um navegador de linha de comando simples, baseado em texto, como links2por exemplo.
terdon
@terdon Enquanto o Pi estiver executando o Linux ou alguma outra variante do Unix, a questão será perfeitamente abordada aqui. Por outro lado, não acho que o Pi seja um computador de acordo com a definição da SU (mas não tenho certeza disso, nunca entendi essa definição nem a vi anotada em nenhum lugar).
Gilles 'SO- stop be evil'
@ Gilles sim, está no tópico, eu não votei para fechar. Eu estava apenas sugerindo que poderia ser um ajuste melhor no SU. E sim, perguntas pi são bem-vindas lá.
terdon

Respostas:

12

A chave para resolver problemas como esse é saber fazer a pergunta. Eu pesquisei no Google procurando por "como acessar o pão panera wifi" e virei essa joia.

Este artigo possui vários scripts que podem ser usados ​​para facilitar o logon automático. Optei por incluir o exemplo do Panera Bread, que aproveita a biblioteca Mechanize do Python.

A solução utiliza o dispatcher.ddiretório do NetworkManager para executar scripts sempre que uma interface de rede específica sobe ou desce. O artigo detalha um script que você colocaria neste 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 roteiro do 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 ---"

Convido você a ler o artigo inteiro se estiver interessado em outros métodos para fazer o logon automático. O artigo tinha várias outras redes Wi-Fi abertas que foram roteirizadas para a área de Baltimore, MD.

slm
fonte
Essa pode ser a única solução, infelizmente, requer um pouco de engenharia reversa para determinar os URLs e os campos de formulário a serem enviados para cada fornecedor diferente que, é claro, tem seus próprios desafios, não menos que o desenvolvedor precisa conhecer todos os provedores possíveis e ter acesso em primeira mão a eles; não necessariamente possível para o meu cenário particular. Acho que é o melhor que posso esperar. Obviamente, a solução de qualquer provedor pode ser interrompida assim que eles decidirem atualizar seus formulários de autenticação na web.
Octopus
1

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

Lembre-se de que esses tipos de autenticação são implementados para manter os sistemas autônomos afastados e permitir que apenas navegadores tenham acesso, exatamente o que você está tentando contornar.

Idealmente, você teria um telefone que possa configurar como ponto de acesso Wi-Fi e conectar seu Pi a essa rede para poder fazer o que quiser, mas isso não é gratuito.

TL; DR: Mendigos não podem escolher

David Wilkins
fonte
1
Se isso for feito através de um navegador, ele deve usar HTTP, portanto isso é certamente possível. No entanto, como não há protocolo ou padrão para esse tipo de autenticação (AFAIK), você precisará implementar algo por provedor. O que será inútil se você quiser levá-lo a algum lugar para o qual não tenha uma implementação. Eu usaria o hotspot do telefone - ele será gratuito se você conectar o telefone à rede aberta.
Goldilocks
1

Aparentemente, essas redes com autenticação baseada na Web dependem da pós-autenticação do controle de acesso baseado em MAC, para que você possa simplesmente se autenticar em um dispositivo diferente enquanto falsifica o endereço MAC do seu Pi e, em seguida, ele deve poder acessar a rede.

Obtenha esta dica em http://frankiejarrett.com/how-to-connect-apple-tv-to-a-hotel-wi-fi-network/

Cerquilha
fonte
1

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

Faço isso regularmente com um roteador de viagem de bolso (antigo AirPort Express) para conectar-me à Internet do hotel, para conectar meu Chromecast e outros dispositivos a essa rede sem ter que se 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.

Mike DeAngelo
fonte