FastAPI で Google OAuth を使った Single Sign-On (SSO) を実装する方法

現代のアプリユーザーは、新しいパスワードを作ることを望んでいません。その解決策が SSO(シングルサインオン) です。

この記事では、FastAPI, MongoDB, JWT, そして fastapi-sso ライブラリを使って、Google アカウントでログイン可能な SSO を構築する方法をステップ・バイ・ステップで解説します。


🔎 なぜ SSO が必要なのか?

SSO は、単なるログイン手段ではなく、ユーザー体験とセキュリティを同時に向上させる重要な機能です。

🔐 1. セキュリティ向上

  • パスワード漏洩やフィッシングのリスクを軽減
  • Google / Microsoft / Facebook の高度な認証技術を活用
  • MFA(多要素認証)との併用も可能

🤝 2. ユーザーの利便性

  • 既存の Google アカウントでログイン可能
  • パスワード管理や再発行が不要
  • 離脱率の低減と登録率の向上に貢献

🛠️ 3. 開発コストの削減

  • パスワード再設定機能の実装が不要
  • ユーザー情報の管理がシンプルに

🧩 4. 複数サービス間の認証統一

  • 一度のログインで複数のサービスにアクセス可能
  • システム全体で統一されたユーザー体験を実現

💼 5. エンタープライズ対応

  • Google Workspace や Azure AD との統合が容易
  • 社内ツールや管理画面に必須の機能

✅ 使用する技術スタック

ツール 用途
FastAPI Python ベースの高速 Web API フレームワーク
fastapi-sso Google OAuth2 の統合
MongoDB + Motor 非同期でユーザーデータを保存
python-jose JWT の生成と検証
passlib パスワードのハッシュ化(オプション)

⚙️ SSO 実装手順(Google OAuth)

1. ライブラリのインストール

pip install fastapi uvicorn motor fastapi-sso python-dotenv python-jose passlib[bcrypt]

2. Google OAuth の設定

  1. Google Cloud Console にアクセス
  2. プロジェクトを作成
  3. OAuth 2.0 クライアント ID を作成
  4. リダイレクト URI を設定:
http://localhost:8000/api/auth/google/callback
  1. クライアント ID とクライアントシークレットを取得

3. .env ファイルを作成

MONGODB_URI=mongodb://localhost:27017
GOOGLE_CLIENT_ID=your-client-id.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=your-client-secret
GOOGLE_REDIRECT_URL=http://localhost:8000/api/auth/google/callback
JWT_SECRET=your_jwt_secret

4. FastAPI の実装概要

主要なエンドポイント:

  • /api/auth/google/login → Google にリダイレクト
  • /api/auth/google/callback → ユーザープロファイルを取得し、JWT を生成
  • /api/register → ユーザー名/パスワードによる登録もサポート(任意)
  • /api/token → 従来型ログイン
  • すべての API ルートは JWT で保護可能

🔄 SSO 認証フロー(図解)

sequenceDiagram
    actor ユーザー
    participant ブラウザ
    participant FastAPI
    participant GoogleOAuth
    participant MongoDB

    ユーザー->>ブラウザ: 「Googleでログイン」クリック
    ブラウザ->>FastAPI: /auth/google/login にアクセス
    FastAPI->>GoogleOAuth: Googleの認証ページへリダイレクト
    ユーザー->>GoogleOAuth: 認証とアクセス許可
    GoogleOAuth->>FastAPI: /callback にリダイレクト(code付き)
    FastAPI->>GoogleOAuth: ユーザープロファイル取得
    GoogleOAuth-->>FastAPI: ユーザー情報(email, 名前, アバター)

    alt 新規ユーザー
        FastAPI->>MongoDB: ユーザー情報を保存
    else 既存ユーザー
        FastAPI->>MongoDB: ユーザー情報を取得
    end

    FastAPI->>FastAPI: JWT トークン生成
    FastAPI-->>ブラウザ: access_token を返却
    ブラウザ->>ユーザー: ログイン完了

🧾 MongoDB に保存されるユーザーデータ(例)

{
  "username": "taro.yamada@gmail.com",
  "email": "taro.yamada@gmail.com",
  "full_name": "山田 太郎",
  "avatar_url": "https://lh3.googleusercontent.com/...",
  "sso_provider": "google",
  "created_at": "2025-07-02T08:00:00Z"
}

🔐 JWT で API を保護する

ログイン後、以下のようにトークンを使用:

Authorization: Bearer <access_token>

保護されたルート例:

@router.get("/me")
async def me(current_user=Depends(get_current_user)):
    return current_user

🚀 拡張可能なポイント

  • Facebook や Microsoft アカウントにも対応可能
  • トークンをフロントエンドに自動リダイレクト
  • モバイルアプリ向け Deep Linking
  • ロール/パーミッション管理の追加

✅ まとめ

この記事で実現したこと:

  • 🔐 Google OAuth を使った SSO ログイン
  • 🧠 JWT によるセキュアな認証
  • 🗂 MongoDB にユーザープロファイルを保存
  • ⚙ FastAPI での統合とルート保護

🏢 Simplico Co., Ltd. へご相談ください

私たち Simplico は、Python(FastAPI)、MongoDB、OAuth、JWT を活用したセキュアなバックエンド開発を専門としています。

API 認証基盤、企業向けSSO、または内製ツールの構築など、お気軽にご相談ください。

🌐 simplico.net にてお問い合わせをお待ちしております。


この投稿を Markdown や PDF 形式でダウンロードしたい場合は、お知らせください。ブログ用アイキャッチ画像もご用意可能です。


Get in Touch with us

Chat with Us on LINE

iiitum1984

Speak to Us or Whatsapp

(+66) 83001 0222

Related Posts

Our Products