LoginSignup
7
8

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-11-01

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

7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8