とりあえず Flask で OIDC を使った Microsoft Entra ID での認証
TL;DR
- Flask でアプリを作る
- Flask-Dance を使って OIDC 認証を設定する
- Azure Container Apps で動かす
やっていく
今回はほぼメモ用の記事なので大した内容はありません。
サクッとやっていきましょう。
Flask でアプリを作って、OIDC 認証を実装する
ソースコードはこちらです。
Azure App ServiceでFlaskアプリケーションを公開する(with AAD認証) をほぼそのままお借りしています。
flask
flask-dance
werkzeug
from flask import Flask, redirect, render_template, request, send_from_directory, url_for
from flask_dance.contrib.azure import make_azure_blueprint, azure
from werkzeug.middleware.proxy_fix import ProxyFix
app = Flask(__name__)
app.wsgi_app = ProxyFix(app.wsgi_app, x_for=1, x_proto=1, x_host=1)
app.secret_key = "STRONG-SECRET-KEY-HERE"
blueprint = make_azure_blueprint(
client_id = "YOUR-CLIENT-ID-HERE",
client_secret = "YOUR-CLIENT-SECRET-HERE",
tenant = "YOUR-TENANT-ID-HERE",
)
app.register_blueprint(blueprint, url_prefix="/login")
@app.route("/", methods=["GET"])
def index():
if not azure.authorized:
return redirect(url_for("azure.login"))
resp = azure.get("/v1.0/me")
assert resp.ok
return "You are {email} on Azure".format(email=resp.json()["userPrincipalName"])
if __name__ == "__main__":
app.run(debug=True)
Microsoft Entra ID (旧 Azure AD) での認証を設定する
Azure Portal から Azure Active Directory を開き、App registrations から新しいアプリを作成します。
Redirect URI は一旦空っぽにしておきますが、後で入れます。
作成したら、Certificates & secrets から新しい client secret を作成します。
ここで表示される Secret は少し経つと表示できなくなるので気を付けてください。
また、Authentication に移り、ID tokens (used for implicit and hybrid flows) のチェックボックスをオンにします。
Azure Container Apps にデプロイする
あとで修正しますが、まずは一番簡単なやり方として Azure Container Apps に全部お任せプランで実行します。
az containerapp up -g <resource-group-name> -n <container-apps-name> --ingress external --target-port 50505 --source .
これだけで実は動きます。
app.py と requirements.txt さえあれば、後は全部お任せ、すごくないですか。
裏側では microsoft/Oryx というのを利用しており、Dockerfile を作ってコンテナ化までをまるっとやってくれます。
Redirect URI を設定する
ということで URL が決まったので、Azure Portal から App registrations で作成したアプリを開き、Authentication に移り、Redirect URI に Azure Container Apps の URL + "/login/azure/authorized" を追加します。
雰囲気的には、https://xxxxxxxxxxxx.xxxxxxxx-xxxxxxxx.japaneast.azurecontainerapps.io/login/azure/authorized みたいな感じになると思います。
作成したアプリにアクセスする
今回は / (ルート、一番上) に対して認証をかけているので、https://xxxxxxxxxxxx.xxxxxxxx-xxxxxxxx.japaneast.azurecontainerapps.io/ にアクセスすると、Microsoft Entra ID の認証画面が表示されます。
適当なアカウントを選択し、うまく認証が済むと、"You are hoge@example.com on Azure" みたいな文字が画面に表示されているはずです。
少し改善していく
このままでもいいのですが、microsoft/Oryx を使うとイメージが大きくなりすぎるので少し変更していきます。
まずは requirements.txt に gunicorn を追加しておきます。
flask
flask-dance
werkzeug
gunicorn
加えて、Dockerfile、.dockerignore、gunicorn.conf.py を追加します。
ここら辺は Azure Container Apps に Flask または FastPI Web アプリをデプロイする を参考にしています。
# syntax=docker/dockerfile:1
FROM python:3.11
WORKDIR /code
COPY requirements.txt .
RUN pip3 install -r requirements.txt
COPY . .
EXPOSE 50505
ENTRYPOINT ["gunicorn", "app:app"]
.git*
**/*.pyc
.venv/
# Gunicorn configuration file
import multiprocessing
max_requests = 1000
max_requests_jitter = 50
log_file = "-"
bind = "0.0.0.0:50505"
workers = (multiprocessing.cpu_count() * 2) + 1
threads = workers
timeout = 120
この状態で再度 az containerapp up
してみると、いい感じになっているはずです、たぶん。
まとめ
というわけで、Flask で OIDC 認証を実装し、それを Azure Container Apps で動かしてみました。
Discussion