loginをアプリにつける方法
authentificationは面倒なので,streamlitのSharingでごまかしていたが,fast.apiで必要そうなので,streamlit-authentificatorをベースに作ってみた.
データベースは無料なのでDETAを使う.
Detaだとfast.apiもタダで公開できる(がまだベータ).
configファイルというのを使って認証オブジェクトを生成するが,それをまるごとDetaのNo SQLデータベースに保管しておく.Detaとのキーは.envに保管し,dotenvパッケージを使って読み込む.
from dotenv import load_dotenv
from deta import Deta
import os
load_dotenv(".env")
DETA_KEY = os.getenv("DETA_KEY")
deta = Deta(DETA_KEY)
db_config = deta.Base("config")
Strealit クラウドだと,App SettingのSecrets で TOML 形式で渡す.
DETA_KEY = " ここにキーを入れる "
DBからconfigを得て,認証オブジェクトを生成する.
cookieのキーはターミナルで生成しておく.
openssl rand -hex 32
import streamlit_authenticator as stauth
fetch = db_config.fetch()
config = fetch.items[0]
authenticator = stauth.Authenticate(
config['credentials'],
config['cookie']['name'],
config['cookie']['key'],
config['cookie']['expiry_days'],
config['preauthorized']
)
後はstreamlit-authntificateパッケージの指示にしたがって,loginなどがstreamlitでできる.loginしているか否かはstreamlitのセッションに保管しておく.
#ログイン
name, authentication_status, username = authenticator.login('Login', location)
st.session_state["authentication_status"]=authentication_status
token発行などは自分でやる必要がある.ソースをみたら,まだ書いていないようなので,内部メソッドを使って自作する必要がある.たとえば,トークン発行は以下のように書ける.
if st.sidebar.checkbox("Get Token"):
try:
authenticator.exp_date = authenticator._set_exp_date()
token = authenticator._token_encode()
st.success('Get token successfully')
st.write(token)
except Exception as e:
st.error(e)
トークンで認証してapiを使ってもらえばよいが,Excelのファイルを自動変換してくれるものでも準備しないと,たぶん使ってくれないだろう.
この記事が気に入ったらサポートをしてみませんか?