カテゴリ: Flask 更新日: 2025/12/28

FlaskでSSO(シングルサインオン)を構築する基本概念を徹底解説!初心者でもわかる認証の仕組み

FlaskでSSO(シングルサインオン)を構築する基本概念
FlaskでSSO(シングルサインオン)を構築する基本概念

先生と生徒の会話形式で理解しよう

生徒

「FlaskでSSOって作れるんですか?ログインを一回だけでいろいろなサービスが使える仕組みですよね?」

先生

「そのとおりです。SSO(シングルサインオン)は一度ログインすると、他のアプリでも再ログインせずに使える便利な仕組みです。」

生徒

「なんだか難しそうですが、Flaskでも作れるんですか?」

先生

「もちろんできます。まずは仕組みをわかりやすく解説してから、Flaskで実現するイメージをつかんでいきましょう。」

1. FlaskでSSOを実現するために知っておくべき基本概念

1. FlaskでSSOを実現するために知っておくべき基本概念
1. FlaskでSSOを実現するために知っておくべき基本概念

SSO(シングルサインオン)とは、ひとつのログインが複数のWebアプリケーションで共有される仕組みのことです。たとえば、学校のオンラインシステムに一度ログインすると、出席管理、授業資料、メッセージ管理などの別々のページを開いても、毎回パスワードを入力する必要がありません。こうした機能は企業のシステムでも多く利用されています。

初心者にとっては少し抽象的ですが、身近な例で言うと、ショッピングセンターの「共通ポイントカード」のようなイメージです。カードを一度提示すると、館内のいろいろな店舗で同じ情報を使ってサービスを受けられます。この「共通の入り口」こそがSSOの本質です。

FlaskでSSOを構築する際は、認証を担当する「認証サーバー」と、それを利用する複数の「クライアントアプリ」の関係を作ります。認証サーバーでログインが成功すると、クライアントからログイン状態を共有できるのが特徴です。

2. SSOのしくみはどう動くのか?初心者向けに図解イメージで理解する

2. SSOのしくみはどう動くのか?初心者向けに図解イメージで理解する
2. SSOのしくみはどう動くのか?初心者向けに図解イメージで理解する

SSOは技術的には複雑な仕組みですが、流れ自体は非常にシンプルです。以下のような順番で動きます。

1. クライアントアプリ(AやB)がユーザーを認証サーバーへ転送する
2. 認証サーバーでユーザーがログインする
3. 認証サーバーが「あなたはログイン済みです」という証明(トークン)をクライアントに渡す
4. クライアントはその証明を使ってユーザーをログイン状態にする

この証明書のことを「トークン」と呼びます。トークンとは、身分証明書のようなもので、「この人は確かにログインしました」という情報を安全に伝える役割を持っています。

FlaskでSSOを実装する場合も、このトークンを中心に設計すると理解がスムーズになります。外部サービスのOAuth認証と似ていますが、SSOは自分で認証基盤を作る点が大きな違いです。

3. Flaskで作るシンプルなSSO構成のイメージ

3. Flaskで作るシンプルなSSO構成のイメージ
3. Flaskで作るシンプルなSSO構成のイメージ

本格的な認証基盤は専門知識が必要ですが、SSOの仕組み自体はFlaskで十分再現できます。基本となるパーツは次の三つです。

① 認証サーバー(Identity Provider)
ここがログインの中心です。ユーザー名やパスワードを管理し、ログインに成功したらトークンを発行します。

② クライアントアプリ(Service Provider)
認証サーバーからトークンを受け取り、ユーザーをログイン状態にします。複数作ればSSOの効果がよくわかります。

③ トークンの検証ロジック
クライアントが「このトークンは本当に正しいのか」をチェックする仕組みです。これは鍵を使って暗号を開くようなイメージで、認証情報の安全性を守るために重要な部分です。

Flaskは軽量で柔軟なため、これら3つを仕組みとして組み立てやすいという強みがあります。Pythonで認証の流れを勉強したい人にとっても、理解しやすい構成です。

4. まずはトークンを発行する仕組みを作る

4. まずはトークンを発行する仕組みを作る
4. まずはトークンを発行する仕組みを作る

以下は「ログイン成功後にトークンを返す」イメージのコードです。これはシンプルな例ですが、SSOの中心部分を理解する助けになります。


from flask import Flask, request, jsonify
import jwt, datetime

app = Flask(__name__)
SECRET = "sso-secret-key"

@app.route("/login", methods=["POST"])
def login():
    user = request.json.get("username")
    pw = request.json.get("password")

    if user == "test" and pw == "pass":
        token = jwt.encode({
            "sub": user,
            "exp": datetime.datetime.utcnow() + datetime.timedelta(minutes=30)
        }, SECRET, algorithm="HS256")
        return jsonify({"token": token})
    return jsonify({"error": "invalid"}), 401

このコードでは、正しいログイン情報を受け取ったときだけトークンを発行します。トークンには「誰か」「いつまで有効か」などの情報を安全に閉じ込めます。

5. クライアントアプリでトークンを読み取りログイン状態を管理する

5. クライアントアプリでトークンを読み取りログイン状態を管理する
5. クライアントアプリでトークンを読み取りログイン状態を管理する

クライアントアプリ側では、認証サーバーから受け取ったトークンを検証します。以下はその基本的な処理です。


@app.route("/protected")
def protected():
    token = request.headers.get("Authorization")

    try:
        user = jwt.decode(token, SECRET, algorithms=["HS256"])
        return jsonify({"user": user["sub"]})
    except:
        return jsonify({"error": "Forbidden"}), 403

このように、トークンさえあればログイン状態を判別できるため、アプリAでもアプリBでも同じトークンを使い回すことでSSOの仕組みが成り立ちます。

6. SSOを運用するうえで知っておくべきポイント

6. SSOを運用するうえで知っておくべきポイント
6. SSOを運用するうえで知っておくべきポイント

FlaskでSSOを組む際には、セキュリティを確保するために次のポイントが大切です。

● トークンの有効期限を短くすること
長くしすぎると、盗まれたときに危険です。

● HTTPSで通信すること
トークンが盗まれないよう暗号化が必須です。

● 秘密鍵の管理を適切に行うこと
SECRETキーを漏らすとSSO自体が破られてしまいます。

これらを守るだけで、シンプルながら安全性の高いSSOシステムをFlaskで構築することができます。

カテゴリの一覧へ
新着記事
New1
Django
Djangoプロジェクトのディレクトリ構造を完全解説!初心者でも迷わないフォルダの見方
New2
Flask
Flask×Flask-SocketIOでチャットアプリを作る流れを初心者向けにやさしく解説
New3
Flask
Flaskアプリの作り方を基礎から学ぼう!初心者が覚えるべき開発の流れとは?
New4
Flask
Flask-WTFでファイルアップロードフォームを完全ガイド!初心者でもわかる画像やPDFのアップロード方法
人気記事
No.1
Java&Spring記事人気No1
Django
Django環境構築の全手順を完全解説!初心者でも迷わないPython・Djangoセットアップガイド
No.2
Java&Spring記事人気No2
Flask
Flask-Loginでユーザー認証を完全ガイド!初心者でもわかるログイン処理の作り方
No.3
Java&Spring記事人気No3
Python
Pythonの文字列を1文字ずつ処理する方法!for文やlist化の活用例
No.4
Java&Spring記事人気No4
Python
PythonでHello Worldを表示するには?初心者向けに最初の1行を実行してみよう
No.5
Java&Spring記事人気No5
Python
Pythonで定数を定義する方法!変更されない変数の書き方と命名ルールを初心者向けに解説
No.6
Java&Spring記事人気No6
Python
Pythonでリストを文字列に変換する方法を完全ガイド!初心者でもわかるjoinの使い方
No.7
Java&Spring記事人気No7
Flask
FlaskアプリをNginx + Gunicornで本番運用する方法!初心者でもわかるデプロイ構成の基本
No.8
Java&Spring記事人気No8
Python
Pythonのmatch文(パターンマッチング)とは?switch文の代替としての使い方をやさしく解説