RSSリーダーをFreeBSD13+python3.9+MySQL+Bottleで作るメモ(1) Basic認証

これまで使ってきたサーバサイド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] は入力したパスワードである。

コメント(0)

コメントを投稿する際はここをクリック


Note

本サイトのハイパーリンクの一部は、オリジナルのサイトが閉鎖してしまったため"Internet archive Wayback Machine"へのリンクとなっています。そのようなリンクにはアイコン[archive]を付与しています。

本サイトはCookieを使用しています。本サイトにおけるCookieは以下の三種類のみであり、Cookieの内容に基づいてサイトの表示を変更する以外の用途には用いておりません。