前提条件: 始める前に、以下がインストールされていることを確認してください。
- Python 3.9 以上
- pip または Poetry パッケージマネージャー
- jq - Auth0 CLI の設定に必要です
- お好みのコードエディター
はじめに
1
Flask の新しいプロジェクトを作成する
Flask API 用に新しいディレクトリを作成します:仮想環境を作成し、アクティベートします:
2
依存関係をインストール
以下の依存パッケージを記載した 依存関係をインストールします:
requirements.txt ファイルを作成します:requirements.txt
3
Auth0 API の設定
次に、Auth0 テナントに新しい API を作成し、アプリケーションを設定します。この作業は、CLI コマンドを実行して自動で行うことも、Auth0 Dashboard から手動で行うこともできます。
- Dashboard
- CLI
- Auth0 Dashboard → アプリケーション → APIs に移動します
- Create API をクリックします
- API の詳細を入力します。
- Name:
My Flask API - Identifier:
https://my-flask-api(これが audience になります) - Signing Algorithm: RS256
- Name:
- Create をクリックします
- Auth0 Dashboard で Domain をコピーします (アプリケーション → アプリケーション → [Your App] → 設定 にあります)
- 作成した Identifier をコピーします (これが audience です)
Domain には
https:// を含めず、ドメイン名のみを使用してください (例: your-tenant.auth0.com) 。Audience (API 識別子) は API の一意の識別子で、有効な URI であれば任意の値を指定できます。4
API権限を定義する
特定のリソースへのアクセスを制御するために、API の権限 (スコープ) を設定します。
- Auth0 Dashboard で、アプリケーション → APIs に移動します
- API (
My Flask API) を選択します - Permissions タブを開きます
- Add Permission をクリックします
- 次の権限を追加します。
- Permission (Scope):
read:messages - Description:
Read messages
- Permission (Scope):
- Add をクリックします
Permissions では、その API に対して実行できる操作を定義します。
write:messages、delete:messages など、複数の権限を追加できます。この Quickstart の /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 で実行中です。チェックポイントこれで、3 つのエンドポイントを備えた Auth0 保護の Flask API が localhost 上で完全に動作しているはずです。
/api/public- 認証なしでアクセス可能/api/private- 有効な Auth0 アクセストークンが必要/api/private-scoped- 認証とread:messages権限が必要
APIをテストする
テスト用トークンを取得する
- Auth0 Dashboardに移動します
- アプリケーション → 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 proof の両方を検証します。スコープベースの認可
スコープベースの認可
特定のスコープを確認するデコレーターを作成します。
エラー処理のベストプラクティス
エラー処理のベストプラクティス
具体的なエラー種別に対応した、包括的なエラー処理を実装します。
すべての認証エラーは
BaseAuthError を継承しており、WWW-Authenticate ヘッダーを含む適切な HTTP レスポンスを返すために、get_status_code()、get_headers()、get_error_code() などのメソッドを提供します。Before-Requestミドルウェアの使用
Before-Requestミドルウェアの使用
ほとんどのエンドポイントで認証が必要なアプリケーションでは、Flask の
before_request を使ってトークンをグローバルに検証します。よくある問題
401 未認可 - 無効な audience
401 未認可 - 無効な audience
症状: 有効そうに見えるトークンを使っていても 401 エラーが発生する原因: トークン内の audience が、API クライアントに設定した audience と一致していない解決策:
.envファイル内のAUTH0_AUDIENCEが Auth0 API 識別子 と完全に一致していることを確認する- audience では大文字と小文字が区別される
- audience が URL または URN 形式になっていることを確認する (例:
my-apiではなくhttps://my-api)
401 未認可 - 無効な 発行者
401 未認可 - 無効な 発行者
症状: 発行者が一致せず、トークンのバリデーションに失敗する原因: ドメインの設定がトークンの発行者と一致していない解決策:
AUTH0_DOMAINが正しいことを確認する (例:tenant.us.auth0.com)- ドメインに
https://を含めない - 末尾にスラッシュを付けない
設定値が見つかりません
設定値が見つかりません
症状:
None の値や環境変数に関するエラーが発生する原因: 環境変数が読み込まれていない、または .env ファイルが見つからない解決策:.envファイルがプロジェクトのルートに存在することを確認するos.getenv()を呼び出す前にload_dotenv()が実行されていることを確認する- 変数名が完全に一致していることを確認する (大文字と小文字を区別)
Flask の async サポートエラー
Flask の async サポートエラー
症状:
RuntimeError: This event loop is already running または同様の async エラーが発生する原因: Flask 3.0 以降を使わずに async のルートを使用している、または sync と async を不適切に混在させている解決策:- Flask 3.0 以上にアップグレードする:
pip install --upgrade flask api_clientを使用するすべてのルートハンドラーがasync defとして宣言されていることを確認する- ルートハンドラー内で
asyncio.run()を使用しない
トークンの有効期限切れエラー
トークンの有効期限切れエラー
症状:
VerifyAccessTokenError: Token is expired原因: アクセストークンの有効期限が切れている解決策:- Auth0 Dashboard の Test タブから新しいトークンをリクエストする
- クライアントアプリケーションでトークンの更新を実装する
- Auth0 Dashboard のトークンは通常 24 時間有効
追加リソース
SDKドキュメント
SDKの完全なドキュメントとAPIリファレンス
Flaskドキュメント
Flaskフレームワークの公式ドキュメント
Auth0 Dashboard
Auth0 テナントとAPIを管理
API認証ガイド
アクセストークンとAPIセキュリティについて詳しく見る
DPoPドキュメント
Proof-of-Possessionセキュリティについて詳しく見る
コミュニティフォーラム
Auth0 Communityでサポートを受ける