2023年3月5日日曜日

Python で OpenIDConnect を使って認証する方法

Python で OpenIDConnect を使って認証する方法

概要

Python の authlib を使えば簡単に OpenIDConnect を使った認証機能を Web アプリケーションに追加することができます

今回は Flask + authlib を使って Onelogin の OpenIDConnect に接続して認証を追加してみました

環境

  • macOS 11.7.4
  • Python 3.10.2
  • authlib 1.2.0
  • Flask 2.2.3

Onelogin 側の設定

OIDC アプリを作成してユーザの追加やリダイレクトURIの設定をしておきましょう
リダイレクトURIは今回は localhost で動作させるので「http://localhost:5000/callback」 を追加しておきましょう

あとはコードに必要になる「Client ID」「Client Secret」「Issuer URL」あたりをコピーしておきます

サンプルコード

  • vim app.py
from flask import (Flask,
                   url_for,
                   session,
                   redirect)
from authlib.integrations.flask_client import OAuth

app = Flask(__name__)
app.secret_key = "xxx"
app.config["ONELOGIN_CLIENT_ID"] = "xxxx"
app.config["ONELOGIN_CLIENT_SECRET"] = "xxxx"

oauth = OAuth(app)
oauth.register(
  name="onelogin",
  server_metadata_url="https://xxxxxx.onelogin.com/oidc/2/.well-known/openid-configuration",
  client_kwargs={"scope": "openid email profile"}
)


@app.route("/")
def homepage():
    user = session.get("user")
    if user is None:
      return redirect("/login")
    return f"user => {user}"


@app.route("/login", methods=["GET"])
def login():
    redirect_uri = url_for("auth", _external=True)
    return oauth.onelogin.authorize_redirect(redirect_uri)


@app.route("/callback")
def auth():
    token = oauth.onelogin.authorize_access_token()
    session["user"] = token["userinfo"]
    return redirect("/")


@app.route("/logout")
def logout():
    session.pop("user", None)
    return redirect("/")

設定を変更するのは ONELOGIN_CLIENT_ID, ONELOGIN_CLIENT_SECRET, server_metadata_url です

動作確認

  • pipenv run flask run

でブラウザで localhost:5000 にアクセスすると onelogin のログイン画面になるのでそこでログ人すれば OK です

最後に

Python の authlib を使って OpenIDConnect 認証を追加する方法を紹介しました
OpenIDConnect 自体 OAuth2 のラップなので認証方法はほぼ OAuth2 と同じになります

参考サイト

0 件のコメント:

コメントを投稿