feat: APIトークン管理API(/api/dashboard/api-keys・QR)の実装 #36
Labels
No labels
h1-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
joe/o2#36
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
概要
APIトークン機構(v50)のうち、ダッシュボードからのトークン管理APIが未実装です。設計は
docs/superpowers/specs/2026-09-16-api-token-design.mdの「2. API トークン管理 API」に定義済みですが、src/o2/api/にルートが存在しません(rg -n 'api-keys' src/o2/api→ 0件)。現状
ApiKeyモデル・ApiKeyService(CRUD/validate)は実装済みPOST /api/auth/api-key-loginは #35 で実装済み未実装エンドポイント(設計より)
/api/dashboard/api-keys/api/dashboard/api-keys/api/dashboard/api-keys/{id}/api/dashboard/api-keys/{id}/api/dashboard/api-keys/{id}/toggle/api/dashboard/api-keys/{id}/reissue/api/dashboard/api-keys/{id}/qr実装時の要件
require_manage以上、一覧/生成は本人のキーに限定するか要検討o2://connect?base_url=<URL>&jwt=<JWT>相当の情報を PNG で返す(qrcode_generator.pyを利用可能か確認)ApiKey.nameは UNIQUE。生成時の衝突をハンドリング受け入れ条件
関連
docs/superpowers/specs/2026-09-16-api-token-design.md対応完了
APIトークン管理API(バックエンド)を実装しました。
実装エンドポイント
/api/dashboard/api-keys/api/dashboard/api-keys/api/dashboard/api-keys/{id}/api/dashboard/api-keys/{id}/api/dashboard/api-keys/{id}/toggle/api/dashboard/api-keys/{id}/reissue/api/dashboard/api-keys/{id}/qrセキュリティ / 境界
require_manageで保護(未認証401 / VIEWER・ACCOUNTANT 403 / ADMIN・PLATFORM_ADMIN 可)Role.PLATFORM_ADMINは全件の参照・操作が可能purpose="api_key"+api_key_id付き。_get_current_userが毎回キーの有効性を検証するため、無効化・失効が即時反映QR の内容
o2://connect?base_url=<base_url>&jwt=<JWT>(JWTは1時間有効)変更ファイル
src/o2/api/api_key.py(新規)/tests/test_api_key_management.py(新規・11件)src/o2/api/__init__.py(ルーター登録)/src/o2/api/auth.py(JWT発行ロジックをissue_token_for_api_keyに抽出し共用)pyproject.toml/uv.lock(qrcode[pil]を追加)テスト結果
成果物
63cf684ab07e07(push 済)残課題
<img>)は #29 で対応ApiKey.name重複時は現状500(必要なら409ハンドリング)上記のとおりバックエンド要件は満たしたためクローズします。