ども!龍ちゃんです。
「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",
]| 項目 | バージョン |
|---|---|
| Python | 3.12 |
| Streamlit | 1.55.0 |
| Authlib | 1.3.2+ |
| OS | DevContainer (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 → /oauth2callback → st.user」という流れになります。
登場人物の役割はこんな感じです。
| 登場人物 | 役割 |
|---|---|
.streamlit/secrets.toml | Google との接続情報(クライアント ID、シークレット等)を保持 |
/oauth2callback | Streamlit が自動でハンドリング。実装は不要 |
st.user | 認証後のユーザー情報(名前、メール等)を格納 |
/oauth2callback は自分で実装しなくていいのがポイントで、Streamlit が勝手にやってくれます。
昔実装したときは、ここのリダイレクトの挙動がややこしかったんです!
準備:Google Cloud ConsoleでOAuthクライアントIDを作成
Google 側の設定手順です。コンパクトにまとめると以下の流れになります。公式チュートリアルは Use the Google Auth Platform to authenticate users にあります。
- OAuth 同意画面を作成
- テストユーザーを追加(Testing ステータス中は登録済みユーザーしかログインできません)
- 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_id | Google Cloud Console で発行したクライアント ID |
client_secret | 同じくクライアントシークレット |
server_metadata_url | OIDC の設定情報が入った 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.tomlAuthlib のインストール(ハマりポイント 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.pyuv で起動する場合も同様です。
cd /path/to/project
uv run streamlit run app.py実際の画面
起動してログインボタンをクリックすると、Google の認証画面に飛んで、戻ってきたらユーザー情報が表示されます。



st.user で取得できるフィールド一覧
実際に取得できたフィールドをまとめておきます。取得できるフィールドはプロバイダーによって異なるので、詳細は st.user の公式ドキュメントを確認してください。
| フィールド | 値の例 | 説明 |
|---|---|---|
is_logged_in | True | ログイン状態 |
name | "田中龍之介" | 表示名 |
email | "ry-tanaka@sios.com" | メールアドレス |
email_verified | True | メール認証済みか |
given_name | "龍之介" | 名 |
family_name | "田中" | 姓 |
picture | "https://..." | プロフィール画像 URL |
ログアウトボタンを押すと st.user.is_logged_in が False に戻って、ログイン画面に切り替わります。動きとしては素直ですね。
まとめ
st.login() を使えば、secrets.toml の設定と数行のコードで Google 認証が実装できました。体感的にも圧倒的にシンプルに書けるようになったと思います。
ハマりポイントのおさらいです。
- Authlib のインストール忘れ:
pyproject.tomlにauthlib>=1.3.2を追加(pip ならpip install "authlib>=1.3.2") - secrets.toml の読み込み失敗:
streamlit runを実行するディレクトリを確認 - リダイレクト URI の末尾スラッシュ: Cloud Console と
secrets.tomlで完全一致させる
今回はローカル環境での動作確認までですが、本番環境では redirect_uri を https:// に変更する必要があります(OAuth 2.0 の仕様上、本番では HTTPS が必須です)。次のステップとしては複数プロバイダーへの対応や、本番デプロイ時の redirect_uri 管理あたりが気になるところです。そのあたりも試したら記事にしますね。
いや~こんだけ簡単に認証ができちゃうと、認可まで踏み込んでGoogleのサービスを使い倒すみたいな可能性が広がっていいですね。
参考リンク
- st.login() API リファレンス
- st.user API リファレンス
- User authentication and information
- Google Auth チュートリアル
- Secrets management
ではまた!

