pythonでbottleで暗号化パスワード(.htpasswd)でのBasic認証

  • 6
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

ユーザ名とパスワードは「.htpasswd」に格納し、パスワードはに暗号化済みとする。
今回は、管理画面「http://hogehoge/manage」にアクセスした場合に、Basic認証が使用されるようにする。
@auth_basic(check)」の記載はhttp://qiita.com/yubessy/items/33789eccb35b659b0b4e を参照させて頂きました。新しいのはSAH1による暗号化のところとなります。

以下、フォルダ構成

/
├── app
│   └── app.py
├── config
│   └─── .htpasswd
└── views
    └── manage.j2

あらかじめ、パスワードを生成し、.htpasswdへ格納する。
htpasswdのオプションは、c:ファイル新規作成、s:sha1(暗号化形式)である。
ユーザ名とパスワードが上記の形式(ユーザ名+":"+"暗号化形式"+暗号化済パスワード)で保存されている。

$ htpasswd -csb .htpasswd user password
$ cat .htpasswd 
user:{SHA}H9WJLeNwKEfNwYPyPeiv9nuZoxk=

python内では、ファイルから上記を読みだして、ユーザが入力した値と比較を行うので、ユーザの入力値を上記の形式で文字列を組み立てる必要がある。

ファイルから読み込んだ情報は改行コードがあるのか、そのままの比較では一致しなかったため、strip()によりトリム処理を行っている。

from bottle import route, run, request, auth_basic
import hashlib
import base64
from bottle imp

#templateパスの追加
TEMPLATE_PATH.append("../views")
ROOT_PATH = os.path.dirname(os.path.abspath(__file__)) #このスクリプトがあるフォルダの絶対パス

def check(username, password):
    #サーバ側設定値の読み取り
    f = open(ROOT_PATH + '/../config/.htpasswd', 'r')
    auth_check_word = f.readline() # ファイル1行データを返す
    f.close()
    #ログイン情報の読み込み
    hs= hashlib.sha1()
    hs.update(password.encode("utf-8"))
    login_word = username + ":{SHA}" + str(base64.b64encode(hs.digest()).decode("utf-8"))
    return auth_check_word.strip() ==login_word.strip() 


@route("/manage")
@auth_basic(check)
def manage():
    return template('manage.j2')

正直、ユーザ認証まわりのベストプラクティスな所は調べずにやってます。今回は管理者が使用する管理画面が1つ必要なだけでしたので、上記にて対応しました。
ほかの方はどの様に実装してるのでしょうか?ActiveDirectoryなど立てているのでしょうか?