Streamlit st.login()でGoogle認証を実装する実践ガイド

ども!龍ちゃんです。

「Streamlit で Google 認証がめっちゃ簡単にできるようになったらしい」って聞いて、実際にやってみました。

結論から言うと、本当にシンプルでした。secrets.toml に接続情報を書いて、あとは数行コードを書くだけで動きます。ただ、ハマりポイントもいくつかあったので、この記事では「ローカル環境で動くところまで」を体験ベースでお伝えしていきますね。

今回の内容です。

  • st.login() とは何か
  • 認証フローの全体像
  • Google Cloud Console の設定手順
  • Streamlit 側の実装コード
  • ハマりポイントと動作確認

それぞれ順番に解説していきます。

前提条件:動作確認環境

今回の検証環境です。

[project]
name = "streamlit-oidc"
version = "0.1.0"
requires-python = ">=3.12"
dependencies = [
    "streamlit>=1.42.0",
    "authlib>=1.3.2",
]
項目バージョン
Python3.12
Streamlit1.55.0
Authlib1.3.2+
OSDevContainer (Linux)

st.login() は Streamlit 1.42.0 で追加された機能で、今回は 1.55.0 で検証しています。パッケージ管理は uv を使っています。

環境構築まわりの関連記事もあわせてどうぞ。

st.login() とは:Streamlit標準の認証API

st.login() は Streamlit 1.42.0(2025年2月)で追加されたネイティブの認証 API です。

これまで Streamlit で認証を実装しようとすると、streamlit-authenticator を入れたり、OAuth2 Proxy を別途立てたり、自前で認証ロジックを書いたりと、それなりに手間がかかっていたんですよね。それが secrets.toml に設定を書いて数行コードを追加するだけで済むようになりました。サードパーティへの依存がかなり減るのがうれしいところです。

対応プロバイダーは Google、Microsoft、Okta など OIDC に準拠しているプロバイダーであれば使えます。

全体像:st.login()のGoogle OIDC認証フロー

まずフローを整理しておきます。

フローとしては「ブラウザ → st.login() → Google OAuth → /oauth2callbackst.user」という流れになります。

登場人物の役割はこんな感じです。

登場人物役割
.streamlit/secrets.tomlGoogle との接続情報(クライアント ID、シークレット等)を保持
/oauth2callbackStreamlit が自動でハンドリング。実装は不要
st.user認証後のユーザー情報(名前、メール等)を格納

/oauth2callback は自分で実装しなくていいのがポイントで、Streamlit が勝手にやってくれます。

昔実装したときは、ここのリダイレクトの挙動がややこしかったんです!

準備:Google Cloud ConsoleでOAuthクライアントIDを作成

Google 側の設定手順です。コンパクトにまとめると以下の流れになります。公式チュートリアルは Use the Google Auth Platform to authenticate users にあります。

  1. OAuth 同意画面を作成
  2. テストユーザーを追加(Testing ステータス中は登録済みユーザーしかログインできません)
  3. OAuth クライアント ID を作成

リダイレクト URI の設定(ハマりポイント 1)

クライアント ID を作成する際、リダイレクト URI に以下を設定します。

http://localhost:8501/oauth2callback

ここだけ注意してください。末尾にスラッシュを付けると動きません。パスの完全一致が必要なので、http://localhost:8501/oauth2callback/ のように末尾スラッシュを付けると認証コールバックが失敗します。
ここは見落とすと大変なのでコピペで行きましょう。

設定画面はこんな感じです。

実装:secrets.tomlの設定とst.login()のコード

secrets.toml の設定

.streamlit/secrets.toml に以下を書きます。設定項目の詳細は公式ドキュメントを参照してください。

[auth]
client_id = "xxxxxxxxxxxx.apps.googleusercontent.com"
client_secret = "GOCSPX-xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
server_metadata_url = "https://accounts.google.com/.well-known/openid-configuration"
redirect_uri = "http://localhost:8501/oauth2callback"
cookie_secret = "ここにランダムな文字列を入れる"

各項目の意味はこんな感じです。

キー説明
client_idGoogle Cloud Console で発行したクライアント ID
client_secret同じくクライアントシークレット
server_metadata_urlOIDC の設定情報が入った URL。Google はこの固定値で OK
redirect_uriコールバック先の URL。Cloud Console の設定と完全一致させる
cookie_secretセッション管理用のランダム文字列

cookie_secret はランダムな文字列であれば何でもよくて、以下のコマンドで生成できます。

python -c "import secrets; print(secrets.token_urlsafe(32))"

# uv の場合
uv run python -c "import secrets; print(secrets.token_urlsafe(32))"

.streamlit/secrets.toml.gitignore に追加するのを忘れないでください。クライアントシークレットが含まれるので、リポジトリにコミットしてはいけません。

# .gitignore
.streamlit/secrets.toml

Authlib のインストール(ハマりポイント 2)

ここ要注意です。st.login() を使うには authlib が別途必要で、Streamlit 本体には含まれていません。

uv を使っている場合は uv add で追加できます。

uv add "authlib>=1.3.2"

pip の場合はこちら。

pip install "authlib>=1.3.2"

インストールせずに実行すると、以下のエラーが出ます。

StreamlitAuthError: To use authentication features, you need to install Authlib>=1.3.2

見ればわかるエラーなんですが、うっかりすると「あれ、なんで動かないんだろう」ってなりますね(なりました)。

最小実装コード

動作確認した実装コードです。

import streamlit as st

st.set_page_config(page_title="Streamlit OIDC Auth Demo", page_icon="🔐", layout="centered")

if not st.user.is_logged_in:
    st.title("🔐 Streamlit OIDC 認証デモ")
    st.write("Google アカウントでログインしてください。")
    st.button("Google でログイン", on_click=st.login, type="primary")
    st.stop()

st.title(f"ようこそ、{st.user.name} さん!")

st.subheader("ユーザー情報")
col1, col2 = st.columns([1, 3])
with col1:
    picture = str(st.user.get("picture", ""))
    if picture:
        st.image(picture, width=100)
with col2:
    st.write(f"**名前**: {st.user.name}")
    st.write(f"**メール**: {st.user.email}")
    st.write(f"**メール認証済み**: {st.user.email_verified}")

with st.expander("st.user の全フィールド(デバッグ用)"):
    fields = ["name", "email", "email_verified", "given_name", "family_name", "picture"]
    for key in fields:
        value = st.user.get(key, "N/A")
        st.code(f"st.user.{key} = {value!r}")

st.divider()
st.button("ログアウト", on_click=st.logout)

構造はシンプルで、st.user.is_logged_in で分岐して、未ログインならボタンを出して st.stop()、ログイン済みならユーザー情報を表示するだけです。ログアウトは st.logout を渡せば完了なのでラクですね。

動作確認とエラー対処

st.user has no attribute "is_logged_in" が出たら(ハマりポイント 3)

このエラーが出る場合は、secrets.toml が読み込まれていない可能性が高いです。

Streamlit は streamlit run を実行したディレクトリにある .streamlit/secrets.toml を参照します(Secrets management)。なので .streamlit/ フォルダがあるディレクトリから起動しているか確認してみてください。

# NG: secrets.toml がないディレクトリから起動
cd /somewhere/else
streamlit run /path/to/app.py

# OK: .streamlit/ があるディレクトリから起動
cd /path/to/project   # ここに .streamlit/secrets.toml がある
streamlit run app.py

uv で起動する場合も同様です。

cd /path/to/project
uv run streamlit run app.py

実際の画面

起動してログインボタンをクリックすると、Google の認証画面に飛んで、戻ってきたらユーザー情報が表示されます。

st.user で取得できるフィールド一覧

実際に取得できたフィールドをまとめておきます。取得できるフィールドはプロバイダーによって異なるので、詳細は st.user の公式ドキュメントを確認してください。

フィールド値の例説明
is_logged_inTrueログイン状態
name"田中龍之介"表示名
email"ry-tanaka@sios.com"メールアドレス
email_verifiedTrueメール認証済みか
given_name"龍之介"
family_name"田中"
picture"https://..."プロフィール画像 URL

ログアウトボタンを押すと st.user.is_logged_inFalse に戻って、ログイン画面に切り替わります。動きとしては素直ですね。

まとめ

st.login() を使えば、secrets.toml の設定と数行のコードで Google 認証が実装できました。体感的にも圧倒的にシンプルに書けるようになったと思います。

ハマりポイントのおさらいです。

  • Authlib のインストール忘れ: pyproject.tomlauthlib>=1.3.2 を追加(pip なら pip install "authlib>=1.3.2"
  • secrets.toml の読み込み失敗: streamlit run を実行するディレクトリを確認
  • リダイレクト URI の末尾スラッシュ: Cloud Console と secrets.toml で完全一致させる

今回はローカル環境での動作確認までですが、本番環境では redirect_urihttps:// に変更する必要があります(OAuth 2.0 の仕様上、本番では HTTPS が必須です)。次のステップとしては複数プロバイダーへの対応や、本番デプロイ時の redirect_uri 管理あたりが気になるところです。そのあたりも試したら記事にしますね。

いや~こんだけ簡単に認証ができちゃうと、認可まで踏み込んでGoogleのサービスを使い倒すみたいな可能性が広がっていいですね。

参考リンク

ではまた!

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。
エンジニア募集中!

コメントを残す

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