Python使用htpasswd實現基本認證授權的例子

來源:互聯網
上載者:User
前面我講解了如何將樹莓派(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 """


Not authenticated


Not authenticated.



"""
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


當一個目錄下有.htpasswd檔案時,mini_httpd就會彈出要求使用者名稱和密碼的對話方塊,輸入正確後才可以瀏覽,如果沒有這個檔案則正常瀏覽。

因為我的cgi應用是基於Python的,所以我希望Python能夠管理.htpasswd檔案,幸好Python世界裡有現成的庫,避免了我們重複造輪子,使用easy_install的安裝方式如下:
複製代碼 代碼如下:


sudo easy_install htpasswd


官方文檔給出的例子如下,感覺操作挺方便的,大家可以試一試:
複製代碼 代碼如下:


import htpasswd

with htpasswd.Basic("/path/to/user.db") as userdb:

try:
userdb.add("bob", "password")
except htpasswd.basic.UserExists, e:
print e
try:
userdb.change_password("alice", "newpassword")
except htpasswd.basic.UserNotExists, e:
print e

with htpasswd.Group("/path/to/group.db") as groupdb:

try:
groupdb.add_user("bob", "admins")
except htpasswd.group.UserAlreadyInAGroup, e:
print e
try:
groupdb.delete_user("alice", "managers")
except htpasswd.group.UserNotInAGroup, e:
print e
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.