ユーザ名とパスワードは「.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など立てているのでしょうか?