Gradioでログイン認証を入れる方法
Gradioで作ったアプリにログイン認証を入れる必要があったので、方法を調べてみました。launchの引数にauthを追加するだけで簡単にできます。
目次
はじめに
Hugging-FaceライクなUIを、Pythonでサクッと作れるGradioというライブラリがあります。ページロード時に認証を入れたかったのですが、公式でサポートされていたのでメモがてらに書いておきます。
ドキュメント:https://gradio.app/sharing-your-app/#authentication
パスワード認証
認証なしのケース
(サンプルコードにありがちですが)以下のアプリを実行すると、特にパスワード認証は求められません。
import gradio as gr
def greet():
return "Hello"
demo = gr.Interface(greet, None, "textbox")
if __name__ == "__main__":
demo.launch()
認証ありのケース
これにパスワード認証を追加するのは簡単で、launchにauth引数を追加します。
import gradio as gr
def greet():
return "Hello"
demo = gr.Interface(greet, None, "textbox")
if __name__ == "__main__":
demo.launch(auth=("username", "password")) # ユーザー名が「username」、パスワードが「password」
最も簡単なケースでは、ユーザー名、パスワードをTupleで入力します。
認証に成功すると、先程の画面が表示されます。
動的な認証
認証を関数にすることも可能です。関数の引数に「ユーザー名、パスワード」を与えて、認証に成功した場合はTrue、失敗した場合はFalseを返す関数を定義します。
import gradio as gr
def greet():
return "Hello"
## パスワードがユーザー名+文字数の場合
def auth(user_name, password):
if password == user_name + str(len(user_name)):
return True # 認証成功
else:
return False # 認証失敗
demo = gr.Interface(greet, None, "textbox")
if __name__ == "__main__":
demo.launch(auth=auth)
このコードでは、以下の例は認証に成功します。
- ユーザー名:root→パスワード:root4
- ユーザー名:usr→パスワード:usr3
auth関数内でDBに接続するとより実践的な例になりそうです。
認証の実装はどうなっているか
認証の内部実装がどうなっているかソースを見てみました。以下のソースコードを読むと、OAuth2PasswordRequestFormを使っていました。
OAuth2PasswordRequestFormはGradioの独自実装ではなく、FastAPIに組み込まれているものを利用しています。以下の解説記事が参考になりそうです。
「OAuth2のパスワード認証を使っている」とざっくり理解しておけば良さそうです。ベーシック認証あたりでごまかしているのかなと思ったのですが、意外と高級なことやっていますね。
Shikoan's ML Blogの中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内
技術書コーナー
北海道の駅巡りコーナー