前面我講解了如何將樹莓派(Raspberry Pi)打造成無線路由,感覺每次通過命令ssh管理顯麻煩,于是自己動手編寫Web界面,主要是使用Python編寫的CGI程序,這里用到了mini_httpd這款輕量的Web服務器,本來想裝nginx的,但是想想還是精簡一些吧,畢竟資源有限,況且Web管理界面僅我一個人訪問。
CGI應用跑起來了,但問題來了,如何實現普通路由的那種打開頁面就彈出輸入用戶名密碼的對話框?
這里主要用到HTTP協議的一個知識,那就是HTTP基本認證。
服務器端通過發送類似下面的頭信息來實現需要認證請求:
代碼如下:
HTTP/1.0 401 Authorization Required
WWW-Authenticate: Basic realm="Secure Area"
Content-Type: text/html
針對上述要求,于是我在CGI中采用了如下的Python代碼:
代碼如下:
def check_login():
import base64
if "Authorization" in os.environ:
try:
cred = base64.b64decode(os.environ['Authorization'].split(' ')[1])
username, password = cred.split(":")
if db_validate_user(username, password): # 這里匹配數據庫用戶名密碼
return True
except:
pass
print 'Status: 401 Unauthorized'
print 'Pragma: no-cache'
print 'Content-Type: text/html'
print 'WWW-Authenticate: Basic realm=/"My Wireless Router/"'
print
print """
<html>
<head>
<title>Not authenticated</title>
</head>
<body>
<h1>Not authenticated.</h1>
</body>
</html>"""
return False
# 調用
if not check_login():
sys.exit(0)
但是實際操作下來后發現mini_httpd并不轉發來自用戶的Authorization的用戶名和密碼,也就是說os.environ取不到這個頭信息,從而導致認證失敗。
經過網上搜索后得知mini_httpd原生支持通過.htpasswd實現簡單認證的技術,也就是說我們可以在需要授權訪問的目錄下建立.htpasswd文件實現,當然這個文件是有格式要求的,我們可以通過htpasswd命令來創建。這個命令一般Apache服務器軟件會自帶,不過mini_httpd也自帶了,所以你可以直接使用這個命令。
代碼如下:
# 建立文件名 賬戶名 密碼
htpasswd -bc .htpasswd admin 123456
新聞熱點
疑難解答