この記事で紹介すること
以下を用いてStreamlitアプリの簡単に認証認可を構成し、アプリロールを用いてページを出し分けする
- App Service 組み込み認証(トークンストア有効)
- Azureの機能であるアプリロール
前提
- Web App(コンテナ)
- Microsoft Azure
組み込み認証の概要は、以下リンクが図解されておりとても分かりやすいです
実装方法
App Service 組み込み認証
アプリロールを設定する
- ポータルからMicrosoft Entra IDに移動する
- 管理>アプリの登録から上述の「App Service 組み込み認証」で自動的に追加されたアプリケーションを選択する
- 管理>アプリロールで権限管理用のロールを追加する(今回はgeneralとadminの二つで,許可されたメンバーの種類:ユーザーまたはグループです)
- ポータルからMicrosoft Entra IDに移動する
- 管理>エンタープライズアプリケーションから2.と同じ名前のアプリケーションを選択する
- 管理>ユーザーとグループ>「+ユーザーまたはグループの追加」からユーザーまたはグループ、ロールを選択する
※複数ロールを同じユーザーに選択したい場合、追加で作成してください(1回の操作で1つのロールしか付与できません)
streamlitアプリ
auth.py
import os
import requests
import streamlit as st
def get_user_info():
user_roles = []
user_name = None
# AppServiceAuthSessionクッキーを取得
cookie = st.context.cookies.get("AppServiceAuthSession")
auth_cookie = {"AppServiceAuthSession": cookie}
host = os.getenv("APP_SERVICE_URL")
try:
auth_me_data = requests.get(f"{host}/.auth/me", cookies=auth_cookie).json()
except Exception as e:
return e
user_claims = auth_me_data[0].get('user_claims', [])
for claim in user_claims:
if claim['typ'] == 'roles':
user_roles.append(claim['val'])
elif claim['typ'] == 'name':
user_name = claim['val']
return user_roles, user_name
main.py
def main():
user_roles, user_name = get_user_info()
top_page = st.Page("front_pages/main/top.py", title="Top", icon=":material/home:")
logout_page = st.Page("front_pages/main/logout.py", title="Logout", icon=":material/logout:")
user_page = st.Page("front_pages/admin/user.py", title="User", icon=":material/account_circle:")
page_dict = {}
if "general" in user_roles:
page_dict["Main"] = [top_page, logout_page]
if "admin" in user_roles:
page_dict["Admin"] = [user_page]
if len(page_dict) > 0:
pg = st.navigation(page_dict)
else:
pg = st.navigation([st.Page("front_pages/unauth/unauth.py")])
pg.run()
if __name__ == "__main__":
main()
これで完成です!
結局どういう認証の経路なの?
図を描きました!
良かったらいいねお願いします!
参考