RSSリーダーをFreeBSD13+python3.9+MySQL+Bottleで作るメモ(1) Basic認証
- 公開日: 2023/02/04(土) 17:15[JST]
これまで使ってきたサーバサイドRSSリーダのTiny Tiny RSS がFreeBSDのアップグレードに伴い使えなくなったので自作しようと思った次第。
これまでは自宅LANの中だけで使っていたけど外からでも使えるならそれはそれで便利だよね、ということでBASIC認証で動かしてみる。
BASIC認証のやり方についてはQiita @yubessy氏による「PythonのbottleでBASIC認証」とBottleの公式マニュアルを参考にした。
from bottle import route, auth_basuc, run, debug, default_app
import pymysql
#定数
DB_IP = 'MySQLのIPアドレス'
WWW_IP = 'Bottleが動作しているサーバのIPアドレス'
WWW_PORT = このWebアプリのポート番号
DBNAME = '使用するデータベースのスキーム名'
DB_USER = 'MySQLにアクセスするユーザ名'
DB_PASS = '上記ユーザのパスワード'
AES_PASS = 'BASIC認証のパスワードをAES暗号化する際のパスワード'
USERTABLE = 'ユーザ名・パスワード名を保存したテーブル名'
USERNAMECOL = '上記テーブルにおいてユーザ名が保存されるカラム名'
PASSWORDCOL = '上記テーブルにおいて暗号化されたパスワードが保存されるカラム名'
#BASIC認証用の関数
def check(username, password):
#DB接続
con = pymysql.connect(
host=DB_IP,
port=3306,
db=DBNAME,
user=DB_USER,
passwd=DB_PASS,
charset='utf8mb4')
cur = con.cursor()
sql = f"SELECT CAST(AES_DECRYPT({PASSWORDCOL}, %s) AS CHAR) FROM {USERTABLE} WHERE {USERNAMECOL}=%s"
#入力されたユーザ名がDBに保存されており、
#かつ保存されているパスワードと入力されたパスワードが一致するときにTrueを返す
r = False
if cur.execute(sql, (AES_PASS, username))!=0:
result = cur.fetchall()
if result[0][0] == password:
r = True
#DB切断
con.close()
cur.close()
return r
#ルートのコンテンツ(認証あり)
@route('/')
@auth_basic(check)
def root_content():
#入力されたユーザ名を返す
return request.auth[0]
if __name__ == '__main__':
run(host=WWW_IP, port=WWW_PORT, debug=True, reloader=True)
else:
debug(mode=False)
application = default_app()
このソースを実行するとBASIC認証を行ってユーザ名を表示する。ユーザ名は bottle.auth[0] で取得可能。なお、 bottle.auth[1] は入力したパスワードである。