【Python】Flaskで実装するBasic・Digest認証(Flask-HTTPAuth)

PythonのライブラリであるFlaskを使って、WebアプリケーションにBasic・Digest認証を実装していきたいと思います。初心者の方にもわかりやすく書いていきますので、是非見てみてください。
今回は、PythonのWebアプリケーション開発ライブラリであるFlaskを使って、Basic・Digest認証を実装していきます。
そもそもFlaskについてあまり知識がないという方は、以下の記事で基本的な解説をしているのでまずはそちらをご覧ください。
Flask-HTTPAuthのインストール
FlaskでBasic・Digest認証を実装するなら、Flask-HTTPAuthを使いましょう。これはFlaskの拡張ライブラリで、認証を簡単に実装することができます。まずはこちらをインストールしていきましょう。
- インストール環境
Python 3.6.0(2.6〜7系でもOKです)
Flask 0.12.2
上記の環境がある状態でコマンド入力画面を開き、以下のコマンドを入力することでインストールできます。
1 |
pip install flask-httpauth |
これでインストール完了です。続いて認証の導入を行いましょう。
Flask-HTTPAuthで認証を実装
Flask-HTTPAuthはBasic・Digest認証の他にもトークン認証などを実装することができますが、今回はBasic・Digest認証の実装方法を紹介していきます。Basic認証とDigest認証の違いがいまいちわからないという方のために、簡単な解説をしておきます。
- Basic認証
別名「基本認証」、HTTPで定義される認証の元祖とも呼ばれる認証方法。id、パスワードをユーザーに入力させ送信、その情報が正しいかどうかをサーバー側で確認して正しければその先へのアクセス権を得ることができる。シンプルかつ実装が容易のため広く使われているが、idとパスワードを暗号化させないでやりとりするため盗聴や改ざんがされやすくセキュリティ面では最悪とも言える認証方式である。- Digest認証
Basic認証よりも後に実装された認証方法。基本はBasic認証と同じだが、こちらはMD5(ハッシュ関数)という暗号化関数を用いて情報を暗号化し、サーバーへ送信するためセキュリティ面でBasic認証よりも優れている。
そこまで重要ではないアプリにはBasic認証、idやパスワードなどを知られたくない場合はDigest認証を用いるといいでしょう。
Basic認証の実装
以下のソースをご覧ください。一部分ずつ見ていきましょう。
1 2 3 |
#必要なライブラリのインポート from flask import Flask from flask_httpauth import HTTPBasicAuth #HTTP"Basic"Auth |
この部分では先ほどインストールしたFlask-HTTPAuth、そしてFlaskのクラスをインポートしています。HTTP”Basic”Authと書いている部分に着目してください。Basic認証だからBasicと記述しています。これがDigest認証ならDigestとなります。
1 2 3 |
#Flask、HTTPBasicAuthクラスのインスタンスを作成 app = Flask(__name__) auth = HTTPBasicAuth() |
上部でインポートしたFlaskとFlask-HTTPAuthについて、それぞれインスタンスを作成しています。
1 2 3 4 5 |
#"id":"パスワード" id_list = { "Tanaka": "1111", "Suzuki": "1234" } |
ここで認証用のidとパスワードを定義しています。実際に実装する時はソースそのものに書くのではなく、別ファイルに分けるなどしましょう。
1 2 3 4 5 6 7 |
#入力されたidに該当するパスワードを #比較のために取得する @auth.get_password def get_pw(id): if id in id_list: return id_list.get(id) return None |
idとパスワードの比較を行う認証のメイン部分です。入力されたidに対して、先ほど定義したid_listをループで回しながら、該当するパスワードを取り出しています。パスワードが存在しなければidが間違っていて、パスワードは存在しても間違っていたら認証を通さないようになっています。
1 2 3 4 5 6 |
#実際の処理部分 @app.route('/') @auth.login_required #ここで認証が行われる #認証に成功したら以下の処理を実行する def index(): return "Hello, %s!" % auth.username() |
こちらはWebアプリケーションの処理部分になっていて、”/”というアドレスをルーティングしています。「@auth.login_required」という部分は「”/”というアドレスにアクセスするタイミングで認証をしろ」という意味になります。
トップページにアクセスする場合にのみ挟んで置くのが一般的だと思います。(ちなみにBasic・Digest認証はブラウザを消すまでが有効期限となっているので、一度認証すればページ更新で再認証ということにはなりません。)
さて、ソースが理解できたら次は実行してみましょう。
1 2 |
python flask-httpauth-digest.py > * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit |
実行したら “http://127.0.0.1:5000/”にアクセスして見ましょう。以下のようなウィンドウが表示されたでしょうか?(画像はChromeでアクセスした場合です。)
上部で定義しているidとパスワードを入力すれば「Hello! “id”」と画面に表示されるはずです。
さて、これでBasic認証を実装できましたね。
続いてはDigest認証です。
Digest認証の実装
以下のソースをご覧ください。
大部分はBasic認証と変わりませんね。なので違いがある部分だけをピックアップして解説していきます。
1 2 3 |
#必要なライブラリのインポート from flask import Flask from flask_httpauth import HTTPDigestAuth #HTTP"Digest"Auth |
Basic認証ではHTTP “Basic” Authでしたが、Digest認証ではHTTP “Digest” Authとなります。
1 2 3 4 |
#Flask、HTTPDigestAuthクラスのインスタンスを作成 app = Flask(__name__) app.config['SECRET_KEY'] = 'secret key here' #ランダムな値を作成する auth = HTTPDigestAuth() |
Basic認証より1行増えていますね。「app.config[‘SECRET_KEY’] = ‘secret key here’」という記述です。「’secret key here’」の部分は暗号化(ハッシュ化)のために必要な文字列で、認証の度にランダムな値を送る必要があります。ここで詳しいDigest認証の仕組みの説明は省きますが、ランダムな値でなければセキュリティ的に意味がない!ということだけ覚えておいてください。
違いはこれだけです。簡単ですね。
Basic・Digest認証ともに簡単に実装できるFlask-HTTPAuth、ぜひ使ってみてください。
「Flaskで実装するBasic・Digest認証(Flask-HTTPAuth)」は以上です。
よろしければ他のノウハウも見ていってください。