web-dev-qa-db-ja.com

ブラウザを使用せずにワイヤレスプロバイダの「オープン」ネットワークに対して認証するにはどうすればよいですか?

この種の設定は、ショッピングモールや空港では一般的なようです。カナダ西部では、Shawがこのようなサービスを提供し、「Shaw Open」と呼んでいます。他のロケールにもT-Mobileなどのプロバイダーからの同様のサービスがあると確信しています。

携帯電話のようなものから、それを行うことはそれほど複雑ではありません。 Wi-Fiホットスポットはパブリックアクセス用に「オープン」であるため、Wi-Fiホットスポットに接続するための認証は必要ありません。しかし、携帯電話はアプリ経由でWebサイトやリモートサービスに接続しませんブラウザーを使用して、ISPが提供する特定のWebページにサインインするまで

簡単に言えば、私の質問は次のとおりです通常、従来のブラウザを備えていないデバイスから認証手順を自動化するにはどうすればよいですか?

私の場合、私はトレードショーなどで使用したいソフトウェアで構成されたRaspberry Piを持っています。これらの場所には同じ種類の「オープン」ホットスポットがあります。 Raspiは自己完結型であることを意図しています。それはちょうどそのビジネスを行い、ウェブサイトに話しかけます。しかし、このアウトバウンド接続は、ISPの「オープン」接続によってブロックされています。これは、プロセスのブラウザー部分を完了していないためです。

特定のプロバイダーのネットワークでこれを行うための資格情報があると仮定すると、Piへのターミナルセッションを開かずにプロセスのその部分を自動化するにはどうすればよいですか?ここではどのような種類のテクノロジも使用されています。検索できること?

13
Octopus

このような問題を解決する鍵は、質問の仕方を知ることです。 「パネラパンwifiにアクセスする方法」を探してGoogleを検索し、この宝石を見つけました。

この記事には、自動ログインを容易にするために使用できるいくつかのスクリプトが含まれていました。PythonのMechanizeライブラリを活用するPanera Breadの例を含めることにしました。

このソリューションは、特定のネットワークインターフェースがアップまたはダウンしたときにスクリプトを実行するために NetworkManagerのdispatcher.dディレクトリ を利用します。この記事では、このディレクトリ/etc/NetworkManager/dispatch.dに配置するスクリプト07-autologin_openwifiについて詳しく説明します。これがそのスクリプトです。

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

そして、これが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 ---"

自動ログインを行う他の方法に興味がある場合は、記事全体を読むことをお勧めします。この記事には、メリーランド州ボルチモア地域向けにスクリプト化された他のオープンWiFiネットワークがいくつかありました。

12
slm

2番目のネットワークデバイスがある場合は、NAT転送を設定できます。携帯電話またはラップトップで「内部」ネットワークに接続し、RPiにその接続をネットワーク全体に転送させます。次に、認証します。ラップトップまたは電話のブラウザを使用して、ネットワークはRPiの外部MACアドレスを確認し、それを認証された接続に関連付けます。

私は定期的にポケットトラベルルーター(旧AirPort Express)を使ってホテルのインターネットに接続し、再認証することなくChromecastと他のデバイスをそのネットワークに接続できます。

さらにシンプル...ネットワークデバイスがUSBでラップトップで動作する場合、それをラップトップに接続してネットワークにログインします。次に、RPiに再接続します。それは数時間動作するはずです。

1
Mike DeAngelo

認証の実装方法によっては、HTTPリクエストを送信してアクセスできる場合があります。ただし、これは特定の実装の多くの側面に依存します。

覚えておいてください、これらのタイプの認証は、ブラウザーのみがアクセスできるようにする一方で、自律システムを遮断するために導入されています。これは、まさに回避しようとしていることです。

理想的には、Wi-Fiホットスポットとして設定し、Piをそのネットワークに接続して、好きなことを実行できる電話を用意しますが、それは無料ではありません。

TL; DR:乞食は選択者になれません

1
David Wilkins

どうやらこれらのWebベースの認証ネットワークは、MACベースのアクセス制御の事後認証に依存しているため、PiのMACアドレスを偽装しながら別のデバイスで認証するだけで、Piがネットワークに接続できるはずです。

http://frankiejarrett.com/how-to-connect-Apple-tv-to-a-hotel-wi-fi-network/ からこのヒントを得ました

1
Hash