Làm cách nào để xác thực với mạng mở của nhà cung cấp dịch vụ không dây mà không cần sử dụng trình duyệt?


13

Kiểu thiết lập này dường như là phổ biến trong các trung tâm mua sắm và sân bay. Ở Tây Canada Shaw cung cấp dịch vụ như vậy và gọi đó là "Shaw Open". Tôi khá chắc chắn rằng các địa phương khác có các dịch vụ tương tự từ các nhà cung cấp như T-Mobile, v.v.

Từ một cái gì đó như điện thoại di động, nó không quá phức tạp để làm. Không cần xác thực để kết nối với điểm phát wifi vì nó "mở" để truy cập công cộng. Nhưng điện thoại di động của tôi sẽ không kết nối với các trang web hoặc dịch vụ từ xa thông qua các ứng dụng cho đến khi tôi sử dụng trình duyệt của mình và đăng nhập vào một trang web cụ thể do ISP cung cấp .

Câu hỏi của tôi chỉ đơn giản là: Làm cách nào để tự động hóa bước xác thực từ một thiết bị thường không có trình duyệt truyền thống?

Trong trường hợp cụ thể của tôi, một quả mâm xôi Pi được cấu hình bằng phần mềm mà tôi muốn sử dụng tại các triển lãm thương mại, vv Các vị trí của luận án có cùng một loại điểm nóng "mở". Raspi có nghĩa là khép kín. Nó chỉ làm kinh doanh của nó và nói chuyện với một trang web. Nhưng kết nối ra bên ngoài này bị chặn bởi kết nối "mở" của ISP vì tôi không có, tôi cũng không thể hoàn thành phần trình duyệt của quy trình.

Giả sử tôi có thông tin đăng nhập để thực hiện việc này trên mạng của nhà cung cấp cụ thể, làm cách nào tôi có thể tự động hóa phần đó của quy trình mà không yêu cầu tôi mở phiên cuối cho Pi? Loại công nghệ nào thậm chí được sử dụng ở đây, mà tôi có thể tìm kiếm?


Giả sử Pi của bạn có Linux, nó có wgetcài đặt chương trình không?
David Wilkins

1
Câu hỏi của bạn không thực sự là về Linux hay Unix, nó sẽ phù hợp hơn với Super User . Ngoài ra, có lý do nào bạn không muốn cài đặt trình duyệt trên pi không? Bạn luôn có thể sử dụng một trình duyệt dòng lệnh, dựa trên văn bản đơn giản như links2ví dụ.
terdon

@terdon Miễn là Pi đang chạy Linux hoặc một số biến thể Unix khác, câu hỏi hoàn toàn thuộc chủ đề ở đây. Ngược lại, tôi không nghĩ Pi là một máy tính theo định nghĩa của SU (nhưng tôi không chắc về điều đó, tôi chưa bao giờ hiểu định nghĩa đó và cũng không thấy nó được viết ra ở bất cứ đâu).
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles vâng, đó là về chủ đề, tôi đã không bỏ phiếu để đóng. Tôi chỉ đề xuất rằng nó có thể phù hợp hơn với SU. Và vâng, câu hỏi pi được chào đón ở đó.
terdon

Câu trả lời:


12

Chìa khóa để giải quyết các vấn đề như thế này là biết cách đặt câu hỏi. Tôi đã tìm kiếm trên Google để tìm "cách truy cập wifi bánh mì panera" và tìm ra viên ngọc này.

Bài viết này có một số tập lệnh có thể được sử dụng để tạo điều kiện cho việc đăng nhập tự động. Tôi đã chọn đưa vào ví dụ cho Panera Bread, sử dụng thư viện Cơ chế của Python.

Các giải pháp làm cho việc sử dụng NetworkManager của dispatcher.dthư mục để chạy các kịch bản bất cứ lúc nào một giao diện mạng cụ thể đi lên hoặc xuống. Bài viết chi tiết một tập lệnh mà bạn đặt trong thư mục này /etc/NetworkManager/dispatch.d, được gọi là 07-autologin_openwifi. Đây là kịch bả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

Và đây là kịch bản bánh mì 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 ---"

Tôi khuyến khích bạn đọc toàn bộ bài viết nếu bạn quan tâm đến các phương pháp khác để thực hiện đăng nhập tự động. Bài viết này có một số mạng WiFi mở khác được viết theo kịch bản cho khu vực Baltimore, MD.


Đây có thể là giải pháp duy nhất, thật không may, nó đòi hỏi một chút kỹ thuật đảo ngược để xác định các url và hình thành các trường để gửi cho mỗi nhà cung cấp khác nhau, tất nhiên có những thách thức riêng không phải là ít nhất mà nhà phát triển phải biết tất cả các nhà cung cấp có thể và có đầu tiên truy cập vào chúng; không nhất thiết có thể cho kịch bản cụ thể của tôi. Tôi đoán đó là về điều tốt nhất tôi có thể mong đợi, mặc dù. Tất nhiên, bất kỳ giải pháp nào của nhà cung cấp đều có thể bị hỏng ngay khi họ quyết định cập nhật các biểu mẫu xác thực web của họ.
Bạch tuộc

1

Tùy thuộc vào cách triển khai xác thực, bạn có thể gửi yêu cầu HTTP để có quyền truy cập. Điều này phụ thuộc vào nhiều khía cạnh của việc thực hiện cụ thể mặc dù.

Hãy nhớ rằng, các loại xác thực này được đưa ra để ngăn chặn các hệ thống tự trị trong khi chỉ cho phép các trình duyệt có quyền truy cập, đó chính xác là những gì bạn đang cố gắng phá vỡ.

Lý tưởng nhất là bạn sẽ có một chiếc điện thoại mà bạn có thể thiết lập làm điểm phát wifi và kết nối Pi của bạn với mạng đó để bạn có thể làm bất cứ điều gì bạn muốn, nhưng điều đó không miễn phí.

TL; DR: Người mới bắt đầu không thể là người chọn


1
Nếu nó được thực hiện thông qua trình duyệt thì nó phải sử dụng HTTP, vì vậy điều này chắc chắn là có thể. Tuy nhiên, vì không có giao thức hoặc tiêu chuẩn cho loại xác thực này (AFAIK), nên bạn phải triển khai một cái gì đó cho mỗi nhà cung cấp. Sẽ là vô ích nếu bạn muốn mang nó đi đâu đó mà bạn không có triển khai. Tôi sẽ đi với điểm phát sóng điện thoại - nó sẽ miễn phí nếu bạn kết nối điện thoại với mạng mở.
goldilocks


1

Nếu bạn có thiết bị mạng thứ hai, bạn có thể thiết lập chuyển tiếp NAT. Kết nối với mạng "nội bộ" của bạn với điện thoại di động hoặc máy tính xách tay của bạn và có RPi chuyển tiếp kết nối đó với mạng lớn. Sau đó xác thực với trình duyệt trên máy tính xách tay hoặc điện thoại của bạn. Mạng nhìn thấy địa chỉ MAC bên ngoài của RPi của bạn và liên kết với địa chỉ được xác thực.

Tôi thường xuyên làm điều này với bộ định tuyến du lịch bỏ túi (AirPort Express cũ) để kết nối với internet của khách sạn, sau đó tôi có thể kết nối Chromecast của mình và các thiết bị khác với mạng đó mà không phải xác thực lại.

Thậm chí đơn giản hơn ... Nếu thiết bị mạng của bạn là usb và hoạt động với máy tính xách tay, hãy kết nối nó với máy tính xách tay và đăng nhập vào mạng. Sau đó kết nối lại với RPi. Nó sẽ hoạt động trong vài giờ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.