5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

App Service EasyAuthとアプリロールを用いた認可でStreamlitアプリを構成する

Last updated at Posted at 2024-10-03

この記事で紹介すること

以下を用いてStreamlitアプリの簡単に認証認可を構成し、アプリロールを用いてページを出し分けする

  • App Service 組み込み認証(トークンストア有効)
  • Azureの機能であるアプリロール

前提

  • Web App(コンテナ)
  • Microsoft Azure

組み込み認証の概要は、以下リンクが図解されておりとても分かりやすいです

実装方法

App Service 組み込み認証

アプリロールを設定する

  1. ポータルからMicrosoft Entra IDに移動する
  2. 管理>アプリの登録から上述の「App Service 組み込み認証」で自動的に追加されたアプリケーションを選択する
  3. 管理>アプリロールで権限管理用のロールを追加する(今回はgeneralとadminの二つで,許可されたメンバーの種類:ユーザーまたはグループです)
  4. ポータルからMicrosoft Entra IDに移動する
  5. 管理>エンタープライズアプリケーションから2.と同じ名前のアプリケーションを選択する
  6. 管理>ユーザーとグループ>「+ユーザーまたはグループの追加」からユーザーまたはグループ、ロールを選択する
    ※複数ロールを同じユーザーに選択したい場合、追加で作成してください(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()

これで完成です!

結局どういう認証の経路なの?

図を描きました!

image.png

良かったらいいねお願いします!

参考

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?