Streamlitを利用することで、簡単にデータアプリケーションを作成できますが、アプリケーションの保護やアクセス制限を行う場合、認証機能が必要になります。
その際に役立つライブラリがStreamlit Authenticatorで、簡単に認証機能を組み込むことができます。
Streamlit Authenticatorの基本的な使い方をまとめてみます。
Streamlit Authenticatorとは?
Streamlit Authenticatorは、ユーザー名とパスワードによる認証機能を簡単に追加できるライブラリです。
以下のような機能が実現できます。
- ログイン画面の作成
- パスワードのハッシュ化
- 認証済みユーザーのアクセス管理
- ユーザー登録やパスワードリセット機能
以下、簡単なログイン画面を作成する例を示しながら、使い方をまとめます。
基本的な使い方
インストール
Streamlit AuthenticatorはPythonのライブラリとして提供されています。
以下のコマンドでインストールできます。
pip install streamlit-authenticator
なお、下記のバージョンで動作確認を行いました。
Python 3.9.13
streamlit-authenticator 0.4.1
設定ファイル例
streamlit-authenticator ライブラリを利用するための設定ファイル(config.yaml)を準備します。
今回は以下の記述内容とします。
cookie:
expiry_days: 30
key: some_signature_key
name: some_cookie_name
credentials:
usernames:
user1:
email: tyamada@gmail.com
failed_login_attempts: 0
logged_in: False
name: Taro Yamada
password: abc
roles:
- admin
- editor
- viewer
user2:
email: hsuzuki@gmail.com
failed_login_attempts: 0
logged_in: False
name: Suzuki Hanako
password: def
roles:
- viewer
expiry_days
クッキーの有効期間(日数)を指定します。
この例では、クッキーは30日間有効です。
有効期限内であれば、ユーザーが再度ログインする必要がなくなります。
key
クッキーを署名するための秘密鍵(文字列)。
この鍵を使用してクッキーの改ざんを防止します。
推測されにくいユニークな文字列を指定する必要があります。
name
クッキーの名前を指定します。
ブラウザに保存されるクッキーを識別するための名前です。
他のアプリケーションで使用されている名前と競合しないようにするのがベストプラクティスです。
email
ユーザーのメールアドレス。
failed_login_attempts
ログイン失敗回数を記録します。
これにより、不正なログイン試行を検出したり、アカウントをロックする仕組みを実装できます。
logged_in
ユーザーが現在ログイン中かどうかを示すフラグ。False
の場合はログアウト状態、True
の場合はログイン済みです。
name
ユーザーの名前。
アプリケーションでユーザーを識別するときに利用されます。
password
ユーザーのパスワード。
平文で保存されていますが、セキュリティ上の理由からハッシュ化して保存することが推奨されます。
roles
ユーザーが持つ役割(ロール)をリスト形式で記述します。
この例では、user1
は admin
、editor
、viewer
の3つの役割を持ち、user2
は viewer
のみを持っています。
ロールに応じて、アプリケーション内の権限やアクセス制御を管理できます。
.yaml は、設定データを記述するために使用される YAML(YAML Ain’t Markup Language)形式のファイルです。YAML は、直感的で読みやすい構造を持つデータシリアライゼーション言語であり、Pythonなど多くのプログラミング言語でサポートされています。
コード例
import streamlit as st
import streamlit_authenticator as stauth
import yaml
from yaml.loader import SafeLoader
with open('config.yaml') as file:
config = yaml.load(file, Loader=SafeLoader)
authenticator = stauth.Authenticate(
config['credentials'],
config['cookie']['name'],
config['cookie']['key'],
config['cookie']['expiry_days']
)
authenticator.login()
if st.session_state['authentication_status']:
authenticator.logout()
st.write(f'ようこそ *{st.session_state["name"]}* さん')
st.title('コンテンツ')
elif st.session_state['authentication_status'] is False:
st.error('ユーザー名またはパスワードが正しくありません')
elif st.session_state['authentication_status'] is None:
st.warning('ユーザー名とパスワードを入力してください')
初期表示は以下のとおりです。
誤ったパスワードを入力して、Loginボタンをクリックします。
正しいパスワードに修正して、ログインボタンをクリックします。
コードの内容
ライブラリの読み込み
streamlit
,streamlit-authenticator
,yaml
をインポート。- 設定ファイル(
config.yaml
)を読み込んでユーザー情報やクッキー設定を取得。
認証システムの初期化
authenticator = stauth.Authenticate(
config['credentials'], # ユーザー情報
config['cookie']['name'], # クッキー名
config['cookie']['key'], # クッキー署名キー
config['cookie']['expiry_days'] # クッキー有効期間
)
ユーザー名、パスワード、ログイン状態を管理する認証システムを作成。
ログインフォームの表示
authenticator.login()
ユーザーがログイン情報(ユーザー名、パスワード)を入力するフォームを表示。
認証結果に応じた処理
if st.session_state['authentication_status']:
authenticator.logout()
st.write(f'ようこそ *{st.session_state["name"]}* さん')
st.title('コンテンツ')
elif st.session_state['authentication_status'] is False:
st.error('ユーザー名またはパスワードが正しくありません')
elif st.session_state['authentication_status'] is None:
st.warning('ユーザー名とパスワードを入力してください')
- ログイン成功時:ユーザー名を表示し、ログアウトボタンとコンテンツを表示。
- ログイン失敗時:エラーメッセージを表示。
- 未入力時警告:メッセージを表示。
おわりに
Streamlit Authenticatorを使用することで、簡単に認証機能を実装できます。
詳細は公式ドキュメントを参考にしてください。ユーザー情報変更などの実装方法も記載されています。