FlaskでSSO(シングルサインオン)を構築する基本概念を徹底解説!初心者でもわかる認証の仕組み
生徒
「FlaskでSSOって作れるんですか?ログインを一回だけでいろいろなサービスが使える仕組みですよね?」
先生
「そのとおりです。SSO(シングルサインオン)は一度ログインすると、他のアプリでも再ログインせずに使える便利な仕組みです。」
生徒
「なんだか難しそうですが、Flaskでも作れるんですか?」
先生
「もちろんできます。まずは仕組みをわかりやすく解説してから、Flaskで実現するイメージをつかんでいきましょう。」
1. FlaskでSSOを実現するために知っておくべき基本概念
SSO(シングルサインオン)とは、ひとつのログインが複数のWebアプリケーションで共有される仕組みのことです。たとえば、学校のオンラインシステムに一度ログインすると、出席管理、授業資料、メッセージ管理などの別々のページを開いても、毎回パスワードを入力する必要がありません。こうした機能は企業のシステムでも多く利用されています。
初心者にとっては少し抽象的ですが、身近な例で言うと、ショッピングセンターの「共通ポイントカード」のようなイメージです。カードを一度提示すると、館内のいろいろな店舗で同じ情報を使ってサービスを受けられます。この「共通の入り口」こそがSSOの本質です。
FlaskでSSOを構築する際は、認証を担当する「認証サーバー」と、それを利用する複数の「クライアントアプリ」の関係を作ります。認証サーバーでログインが成功すると、クライアントからログイン状態を共有できるのが特徴です。
2. SSOのしくみはどう動くのか?初心者向けに図解イメージで理解する
SSOは技術的には複雑な仕組みですが、流れ自体は非常にシンプルです。以下のような順番で動きます。
1. クライアントアプリ(AやB)がユーザーを認証サーバーへ転送する
2. 認証サーバーでユーザーがログインする
3. 認証サーバーが「あなたはログイン済みです」という証明(トークン)をクライアントに渡す
4. クライアントはその証明を使ってユーザーをログイン状態にする
この証明書のことを「トークン」と呼びます。トークンとは、身分証明書のようなもので、「この人は確かにログインしました」という情報を安全に伝える役割を持っています。
FlaskでSSOを実装する場合も、このトークンを中心に設計すると理解がスムーズになります。外部サービスのOAuth認証と似ていますが、SSOは自分で認証基盤を作る点が大きな違いです。
3. Flaskで作るシンプルなSSO構成のイメージ
本格的な認証基盤は専門知識が必要ですが、SSOの仕組み自体はFlaskで十分再現できます。基本となるパーツは次の三つです。
① 認証サーバー(Identity Provider)
ここがログインの中心です。ユーザー名やパスワードを管理し、ログインに成功したらトークンを発行します。
② クライアントアプリ(Service Provider)
認証サーバーからトークンを受け取り、ユーザーをログイン状態にします。複数作ればSSOの効果がよくわかります。
③ トークンの検証ロジック
クライアントが「このトークンは本当に正しいのか」をチェックする仕組みです。これは鍵を使って暗号を開くようなイメージで、認証情報の安全性を守るために重要な部分です。
Flaskは軽量で柔軟なため、これら3つを仕組みとして組み立てやすいという強みがあります。Pythonで認証の流れを勉強したい人にとっても、理解しやすい構成です。
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. クライアントアプリでトークンを読み取りログイン状態を管理する
クライアントアプリ側では、認証サーバーから受け取ったトークンを検証します。以下はその基本的な処理です。
@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を運用するうえで知っておくべきポイント
FlaskでSSOを組む際には、セキュリティを確保するために次のポイントが大切です。
● トークンの有効期限を短くすること
長くしすぎると、盗まれたときに危険です。
● HTTPSで通信すること
トークンが盗まれないよう暗号化が必須です。
● 秘密鍵の管理を適切に行うこと
SECRETキーを漏らすとSSO自体が破られてしまいます。
これらを守るだけで、シンプルながら安全性の高いSSOシステムをFlaskで構築することができます。