こしあん
2023-01-23

Gradioでログイン認証を入れる方法


Pocket
LINEで送る
Delicious にシェア

3.1k{icon} {views}


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を使っていました。

https://github.com/gradio-app/gradio/blob/862a8c7c71efe89d8d08175cfa4abc1cff91fa2a/gradio/routes.py#L176

OAuth2PasswordRequestFormはGradioの独自実装ではなく、FastAPIに組み込まれているものを利用しています。以下の解説記事が参考になりそうです。

FastAPI OAuth2パスワード認証

「OAuth2のパスワード認証を使っている」とざっくり理解しておけば良さそうです。ベーシック認証あたりでごまかしているのかなと思ったのですが、意外と高級なことやっていますね。

Pocket
Delicious にシェア



Shikoan's ML Blogの中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内

技術書コーナー

北海道の駅巡りコーナー


Add a Comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です