Repository navigation
✨ org-accounts-auth-context: スイッチ式認証 (X-Organization-Id ヘッダで組織コンテキスト操作) - #58
Conversation
…解決 + SessionContext 拡張 + 組織 Profile 操作
- 認証後 middleware で X-Organization-Id を組織コンテキストに解決
(org 存在確認 404 → メンバーシップ検証 403 → org AccountId + OrgRole)
- SessionContext に org_context を追加し GET /api/v1/me/session-context で返却
- POST /api/v1/profiles を追加し組織コンテキスト主体で Profile 作成
(1 org : 1 Profile 制約維持、2件目は 422)
- PATCH /api/v1/accounts/{id} は個人経路 Keto account_edit 据え置き、
組織コンテキストでは org AccountId 一致で認可 (Member 以上は検証済み)
- CORS / utoipa に X-Organization-Id を反映、openapi.json 再生成
- コンテキスト未指定は既存挙動のまま (後方互換)
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #58 +/- ##
==========================================
+ Coverage 75.64% 75.95% +0.31%
==========================================
Files 209 211 +2
Lines 24496 24601 +105
==========================================
+ Hits 18529 18686 +157
+ Misses 5967 5915 -52 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
Review: request-update (org-accounts-auth-context)packet ( [Blocker] 新 API surface が内部 BIGINT id を nanoid として露出している (ADR 0007 §4 違反)foundation (PR #56) で確定した API 契約 —「
期待する修復:
照合済みの acceptance criteria (修正は finding 部分のみで OK)
|
…は組織 nanoid を返す レビュー指摘 (ADR 0007 §4: 外部表現は nanoid、内部 BIGINT id を露出しない) 対応。 - OrganizationContext に org_account_nanoid を追加し resolve_organization_context で格納 - get_session_context と create_organization_profile の応答で nanoid を返却 (round-trip 成立) - 対応テストを nanoid 比較に更新 + Profile 作成応答に nanoid assertion 追加
turtton
left a comment
There was a problem hiding this comment.
Approve (rereview) — semantic review verdict
前ラウンド request-update (#issuecomment-5512883839: 内部 BIGINT id / nanoid 露出, ADR 0007 §4 違反) への repair を検証。
改善確認
OrganizationContextResponse.org_account_id/ProfileResponse.account_idが org nanoid を返す —OrganizationContext.org_account_nanoidを新設しresolve_organization_contextでorganization.nanoid()から設定、me.rs/profile.rsの応答がこれを利用。- X-Organization-Id round-trip 成立 — 解決入口 (
find_by_nanoid(header)) と応答の nanoid が同一値のため、応答のorg_account_idを次リクエストのヘッダにそのまま投入可能。 - テストが nanoid 比較に更新 —
client_tests.rsの session-context assertion とcreate_profile_with_organization_context_uses_organization_account_idがfixture.organization.nanoid()比較。 - 前回照合済み AC 1-8 に回帰なし — repair 差分は指摘範囲の 5 ファイルに限定 (session_context.rs / api/mod.rs / me.rs / profile.rs / client_tests.rs)、CI 全 12 件 green。
ADR 0007 §4 (全て nanoid 経由・内部 id 非露出) に整合。残課題なし。closeout へ進む。
org-accounts-auth-context: スイッチ式認証
認証済み個人がログインしたまま、リクエストヘッダ
X-Organization-Idで組織コンテキストを指定して操作できるようにする (issue #57)。
実装内容
server/src/api/organization_context.rs) がX-Organization-Id(org nanoid) を解決 — org 存在確認 (404) →要求者の個人 AccountId で
organization_membersの active membership 検証 (403) →OrganizationContext { org_account_id, role }を request extension に格納Noneが格納され、既存の個人経路に一切の挙動変化なしorg_context: Option<OrganizationContext>を追加し、GET /api/v1/me/session-contextで返却POST /api/v1/profilesを新設。組織コンテキストではorg AccountId を所有者として作成。1 org : 1 Profile 制約維持 (2件目は
422)PATCH /api/v1/accounts/{account_id}は個人経路では従来どおり Keto
account_edit、組織コンテキストでは解決済み org AccountId と対象 AccountId の一致で認可
(Member 以上の membership は middleware で検証済み)
x-organization-idを許可ヘッダに追加し、対象操作に header contract を記載。
openapi.json再生成検証
cargo fmt --check/cargo check --workspace/cargo clippy --workspace -- -D warnings: 緑cargo test --workspace: 446 passed, 0 failed (実 PostgreSQL + 実 Axum router)非存在 org (404) / org Profile 作成 (org AccountId 所有) / 2件目拒否 (422) /
org コンテキストでの Profile 更新許可
Closes #57