【RaspberryPi】Apache+WSGI+FlaskでBasic認証を実装する


概要

WSGIを使ってデプロイしているFlaskアプリケーションに.htaccessでBasic認証をかけようとしたができなかったので、別の方法を試してみた。

はじめに

この記事では、すでにWGSIを用いてFlaskアプリケーションがデプロイされた状態での記事になっています。

【Raspberry Pi】Apache+WSGI+Python Flaskを使ってhttpsでWebアプリケーションを公開する - Qiita

使用環境

  • Raspbian 10.7
  • Apache 2.4.38
  • Python 3.7.3
  • Flask 1.0.2
  • Flask-httpauth 4.2.0

環境構築

Flaskアプリケーションの設定

flask-httpauthのインストール

RaspberryPi上でFlaskでBasic認証を可能にするパッケージをインストールします。筆者の環境はPython3なのでpip3コマンドを使用しますが、Python2を使用しているならpipを使用します。

$sudo pip3 install flask-httpauth

app.pyの編集

以下のようなFlaskアプリケーションを用意します。

app.py
from flask import Flask
from flask_httpauth import HTTPBasicAuth

app = Flask(__name__)
auth = HTTPBasicAuth()

users = {
    "user1": "password"
}

@auth.verify_password
def verify_password(username, password):
    if username in users and password == users.get(username):
        return username

@app.route('/')
@auth.login_required
def hello():
    return 'Hello {}!'.format(auth.current_user())

if __name__ == '__main__':
    app.run()

@auth.get_passwordはパスワードを取得するために使用され、認証には非推奨とのことなので、@auth.verify_passwordを使用しています。
@auth.login_requiredはBasic認証を突破出来たら、その先を実行する機能です。
この時点でBasic認証はできるようになっていますが、今のままでは何を入力しても認証はできません。

Apacheの設定

configファイルの編集

前の記事で作成したconfファイルのWSGIを記載した部分に以下の内容を追記します。

flask_wsgi.conf
WSGIPassAuthorization On

これによりWSGIアプリケーションへHTTP承認を受け渡すことができるので、Basic認証が正常に使えるようになります。

Apache2の再起動

忘れずにApache2のロードも行っておきます。

$sudo systemctl reload apache2

正常に再起動できたら、実際の画面を開いてBasic認証が作動するか確認します。
お疲れさまでした。

まとめ

今回は、httpsで動作していたのでシンプルなベーシック認証を実装しましたが、セキュリティの関係上ダイジェスト認証の方がいいのかなーって思います。
あと、今のままだとユーザ名とパスワードがべた書きなのでハッシュ関数なども導入してもう少し実用的な機能にしたいと思います。いずれ...

参考