ホームページ  >  記事  >  バックエンド開発  >  htpasswd を使用して Python で基本認証と認可を実装する例

htpasswd を使用して Python で基本認証と認可を実装する例

WBOY
WBOYオリジナル
2016-06-16 08:43:511496ブラウズ

先ほど、Raspberry Pi を無線ルーターに組み込む方法を説明しましたが、毎回 ssh コマンドで管理するのは面倒だと感じたので、主に Python で書かれた CGI プログラムを使用して Web インターフェイスを自分で書きました。ここでは Mini_httpd を使用します。当初は nginx をインストールしたかったのですが、リソースが限られているため、Web 管理インターフェイスにアクセスできるのはもっと簡単だと思いました。

CGI アプリケーションは実行されていますが、ユーザー名とパスワードを入力するページを開いたときにポップアップ表示される共通ルーティング ダイアログ ボックスをどのように実現するかという疑問が生じます。

htpasswd を使用して Python で基本認証と認可を実装する例

ここでは主に、HTTP プロトコルの知識の 1 つである HTTP 基本認証を使用します。

サーバーは、次のようなヘッダー情報を送信することで認証リクエストを実装します:

コードをコピー コードは次のとおりです:

HTTP/1.0 401 Authorization Required
WWW-Authenticate: Basic realm="Secure Area"
Content-Type: text/html
上記の要件を考慮して、次の Python を使用しましたCGI コード内:
コードをコピー コードは次のとおりです:

def check_login():
importbase64

if "Authorization" in os.environ:
try:
cred =base64.b64decode(os.environ['Authorization'].split(' ')[1])
ユーザー名、password = cred.split(":")
if db_validate_user(username, password): # ここでデータベースのユーザー名とパスワードを照合します
return True
ただし、
pass

print 'ステータス: 401 Unauthorized '
print 'Pragma: no-cache'
print 'Content-Type: text/html'
print 'WWW-Authenticate: Basic realm="My Wireless Router"'
print
print """


認証されていません

< body>
< ;h1>認証されていません。

"""
return False

# Call
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")
htpasswd.basic.UserExists を除く、e:
print e
try:
userdb.change_password("alice", "newpassword")
htpasswd.basic を除く.UserNotExists、e:
print e

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

try:
groupdb.add_user( "bob", "admins")
htpasswd.group.UserAlreadyInAGroup を除く, e:
print e
try:
groupdb.delete_user("alice", "managers")
htpasswd を除く.group.UserNotInAGroup, e:
print e
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。