You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Split out from the broken-access-control remediation (#59, PR #66).
_docs/active/API_CONTRACTS.md documents X-API-Key service-to-service auth for POST /practice/assign, /practice/assign/async, /nudges/check, and /overrides/, and shows the Rails backend calling them with that header. No code has ever read or validated X-API-Key — settings.ai_service_api_key (src/config/settings.py) is declared and unused. Those routes were therefore effectively unauthenticated, which is the vulnerability PR #66 closes.
Consequence of #66: any server-to-server caller relying on unauthenticated access to those routes will now receive 401.
Decide one of:
Confirm the Rails caller sends a real (tutor/admin) JWT; update API_CONTRACTS.md to drop the X-API-Key story.
Split out from the broken-access-control remediation (#59, PR #66).
_docs/active/API_CONTRACTS.mddocumentsX-API-Keyservice-to-service auth forPOST /practice/assign,/practice/assign/async,/nudges/check, and/overrides/, and shows the Rails backend calling them with that header. No code has ever read or validatedX-API-Key—settings.ai_service_api_key(src/config/settings.py) is declared and unused. Those routes were therefore effectively unauthenticated, which is the vulnerability PR #66 closes.Consequence of #66: any server-to-server caller relying on unauthenticated access to those routes will now receive 401.
Decide one of:
API_CONTRACTS.mdto drop theX-API-Keystory.X-API-Keypath as a scoped service identity that resolves to a specific authorized actor. A blanket key that bypasses ownership would re-open the exact BOLA fix(sec): remediate broken access control (BOLA/IDOR) across API + parent model (#59) #66 closed, so it must NOT skipassert_can_access_student.Blocks any production reliance on those routes from Rails.