前提条件: 開始する前に、以下がインストールされていることを確認してください。
- Python 3.9 以降
- pip または Poetry パッケージマネージャー
- jq - Auth0 CLI のセットアップに必要
- 任意のコードエディター
はじめに
1
新しい Flask プロジェクトを作成する
Flask API 用の新しいディレクトリを作成します。仮想環境を作成して、有効化します。
2
依存関係をインストール
次の依存関係を含む 依存関係をインストールします:
requirements.txt ファイルを作成します。requirements.txt
3
Auth0 API をセットアップする
次に、Auth0 テナントで新しい API を作成し、アプリケーションを設定する必要があります。これには、CLI コマンドを実行して自動的に行う方法と、Dashboard から手動で行う方法があります。
- ダッシュボード
- CLI
- Auth0 Dashboard → Applications → APIs に移動します
- Create API をクリックします
- API の詳細を入力します。
- Name:
My Flask API - Identifier:
https://my-flask-api(これがオーディエンスになります) - Signing Algorithm: RS256
- Name:
- Create をクリックします
- Auth0 Dashboard から ドメイン をコピーします (場所: Applications → Applications → [Your App] → Settings)
- 作成した Identifier をコピーします (これがオーディエンスです)
ドメイン には
https:// を含めないでください。ドメイン名のみを使用します (例: your-tenant.auth0.com) 。対象者 (API Identifier) は API の一意の識別子であり、有効な URI であれば任意の値を指定できます。4
API の権限を定義する
特定のリソースへのアクセスを制御するため、API の権限 (スコープ) を設定します。
- Auth0 Dashboard で、Applications → APIs に移動します
- API (
My Flask API) を選択します - Permissions タブを開きます
- Add Permission をクリックします
- 次の権限を追加します。
- Permission (Scope):
read:messages - Description:
Read messages
- Permission (Scope):
- Add をクリックします
権限は、その API に対して実行できる操作を定義します。
write:messages、delete:messages など、複数の権限を追加できます。このクイックスタートの /api/private-scoped エンドポイントには、read:messages 権限が必要です。5
Auth0 のクライアントを設定する
手順 3 で CLI の方法を使用した場合、
.env ファイルは自動的に作成されています。以下の app.py ファイルの作成に進んでください。.env ファイルを作成します。.env
app.py ファイルを作成し、Auth0 API クライアントを設定します。app.py
5
保護されたルートを作成する
ルートを保護するデコレーターを追加し、パブリックエンドポイントとプライベートエンドポイントを作成します。
app.py
6
API を起動する
Flask アプリケーションを起動します。API は
http://localhost:5000 で起動しています。チェックポイントこれで、Auth0 で保護された完全に機能する Flask API が localhost 上で動作しており、次の 3 つのエンドポイントを利用できるはずです。
/api/public- 認証なしでアクセス可能/api/private- 有効な Auth0 アクセストークンが必要/api/private-scoped- 認証とread:messages権限が必要
APIをテストする
テスト用トークンを取得する
- Auth0 Dashboard を開きます
- Applications → APIs に移動します
- 対象の API を選択します
- Test タブを開きます
- アクセストークンをコピーします
リクエストを送信する
YOUR_ACCESS_TOKEN を、Auth0 Dashboard からコピーしたトークンに置き換えます。
高度な使い方
カスタムクレームの検証
カスタムクレームの検証
アクセストークンに特定のクレームが含まれていることを必須にします。
DPoP 認証
DPoP 認証
セキュリティをさらに強化するには、DPoP (Demonstrating Proof-of-Possession) を有効にします。DPoP は、アクセストークンを暗号鍵に結び付けることで OAuth 2.0 を強化します。
verify_request() メソッドは、リクエストで Bearer 認証と DPoP 認証のどちらが使われているかを自動的に判別します。DPoP が使用されている場合は、RFC 9449 に従ってアクセストークンと DPoP 証明の両方を検証します。エラー処理のベストプラクティス
エラー処理のベストプラクティス
特定のエラー型を使って、包括的なエラー処理を実装します。
すべての認証エラーは
BaseAuthError を継承しており、BaseAuthError は get_status_code()、get_headers()、get_error_code() などのメソッドを提供します。これにより、WWW-Authenticate ヘッダーを含む適切な HTTP レスポンスを返せます。Before-Request ミドルウェアの使用
Before-Request ミドルウェアの使用
ほとんどのエンドポイントで認証が必要なアプリケーションでは、Flask の
before_request を使用してトークンをグローバルに検証します。よくある問題
設定値が見つからない
設定値が見つからない
症状:
None の値や環境変数に関するエラーが発生する原因: 環境変数が読み込まれていないか、.env ファイルが見つからない解決策:- プロジェクトのルートに
.envファイルが存在することを確認します os.getenv()を呼び出す前にload_dotenv()が実行されていることを確認します- 変数名が完全に一致していることを確認します (大文字と小文字は区別されます)
Flask の非同期サポートエラー
Flask の非同期サポートエラー
症状:
RuntimeError: This event loop is already running または同様の非同期エラーが発生する原因: Flask 3.0+ を使用せずに非同期ルートを使っているか、同期処理と非同期処理を誤って混在させている解決策:- Flask 3.0 以降にアップグレードします:
pip install --upgrade flask api_clientを使用するすべてのルートハンドラーがasync defとして宣言されていることを確認します- ルートハンドラー内で
asyncio.run()を使用しないでください
トークンの有効期限切れエラー
トークンの有効期限切れエラー
症状:
VerifyAccessTokenError: Token is expired原因: アクセストークンの有効期限が切れている解決策:- Auth0 Dashboard の Test タブから新しいトークンをリクエストします
- クライアントアプリケーションにトークンの更新処理を実装します
- Dashboard のトークンは通常 24 時間有効です
追加リソース
SDK ドキュメント
SDK の完全なドキュメントと API リファレンス
Flask ドキュメント
Flask フレームワークの公式ドキュメント
Auth0 Dashboard
Auth0 のテナントと API を管理
API 認証ガイド
アクセストークンと API セキュリティについて確認
DPoP ドキュメント
proof-of-possession セキュリティについて確認
コミュニティフォーラム
Auth0 コミュニティからサポートを受ける