前提条件: 開始する前に、以下がインストールされていることを確認してください。
- Python 3.9 以降
- pip または Poetry パッケージマネージャー
- jq - Auth0 CLI のセットアップに必要
- 任意のコードエディター
はじめに
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 であれば任意の値を指定できます。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 権限が必要です。Auth0 のクライアントを設定する
手順 3 で CLI の方法を使用した場合、
.env ファイルは自動的に作成されています。以下の app.py ファイルの作成に進んでください。.env ファイルを作成します。.env
app.py ファイルを作成し、Auth0 API クライアントを設定します。app.py
チェックポイントこれで、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 を使用してトークンをグローバルに検証します。よくある問題
401 Unauthorized - 無効なオーディエンス
401 Unauthorized - 無効なオーディエンス
401 Unauthorized - 無効な issuer
401 Unauthorized - 無効な issuer
設定値が見つからない
設定値が見つからない
症状:
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 時間有効です
Authorization ヘッダーがない
Authorization ヘッダーがない
追加リソース
SDK ドキュメント
SDK の完全なドキュメントと API リファレンス
Flask ドキュメント
Flask フレームワークの公式ドキュメント
Auth0 Dashboard
Auth0 のテナントと API を管理
API 認証ガイド
アクセストークンと API セキュリティについて確認
DPoP ドキュメント
proof-of-possession セキュリティについて確認
コミュニティフォーラム
Auth0 コミュニティからサポートを受ける