Skip to content

🐛(backend) accept configurable media-auth forward headers (Traefik X-Forwarded-Uri)#743

Open
mosa-riel wants to merge 1 commit into
suitenumerique:mainfrom
mosacloud:fix/media-auth-forwarded-uri
Open

🐛(backend) accept configurable media-auth forward headers (Traefik X-Forwarded-Uri)#743
mosa-riel wants to merge 1 commit into
suitenumerique:mainfrom
mosacloud:fix/media-auth-forwarded-uri

Conversation

@mosa-riel

Copy link
Copy Markdown

Summary

ItemViewSet._authorize_subrequest() only reads HTTP_X_ORIGINAL_URL, an nginx-ingress convention. On clusters running Traefik (or any RFC-7239-style proxy) the equivalent header is X-Forwarded-Uri, so the lookup returns None and every /media/... subrequest is denied with a 403 — uploads succeed but downloads/previews never resolve.

This reads the original URL from the first present header in a new, configurable MEDIA_AUTH_FORWARD_HEADERS setting (default ["X-Original-Url", "X-Forwarded-Uri"], tried in order). nginx-ingress deployments are unaffected because X-Original-Url stays first; other proxies can be supported purely by overriding the env var, with no code change.

Changes

  • core/api/viewsets.py — iterate the configured headers, convert each to its META key (HTTP_ prefix, uppercased, dashes→underscores) and use the first one present.
  • drive/settings.py — new MEDIA_AUTH_FORWARD_HEADERS list setting (env MEDIA_AUTH_FORWARD_HEADERS), defaulting to ["X-Original-Url", "X-Forwarded-Uri"].
  • core/tests/items/test_api_items_media_auth.py — mirror tests exercising X-Forwarded-Uri for the 200 (public) and 403 (authenticated/restricted) paths, plus a no-header 403 case.

Test plan

  • Existing test_api_items_media_auth.py suite still green (X-Original-Url path unchanged).
  • New X-Forwarded-Uri cases reach the same authorization decisions (200/403).
  • No-header subrequest still denied (403).
  • Manual: behind Traefik with a ForwardAuth middleware, GET /media/<key> returns 200 for an authorized user (previously 403).

22 passed locally (DJANGO_CONFIGURATION=Test pytest core/tests/items/test_api_items_media_auth.py).

ItemViewSet._authorize_subrequest() only read HTTP_X_ORIGINAL_URL, an
nginx-ingress convention. On clusters running Traefik (or any RFC-7239
style proxy), the equivalent header is X-Forwarded-Uri, so the lookup
returned None and every /media/... request 403'd — uploads succeeded but
downloads/previews never resolved.

Read the original URL from the first present header in the new
MEDIA_AUTH_FORWARD_HEADERS setting (default ["X-Original-Url",
"X-Forwarded-Uri"]), tried in order. nginx-ingress users are unaffected
since X-Original-Url stays first; other proxies can be supported by
overriding the env var with no code change.
@kernicPanel
kernicPanel self-requested a review July 8, 2026 05:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant