fix(nginx): przepuść /.well-known/ (discovery OAuth) mimo blokady plików ukrytych#21
Merged
Merged
Conversation
…kow ukrytych Reguła `location ~ /\.` blokujaca .git/.env przechwytywala takze /.well-known/ i zwracala 403. Regexy w nginksie maja pierwszenstwo przed zwyklymi prefiksami, wiec zaden prefiksowy location nie mogl jej wyprzedzic. Skutek: metadane serwera autoryzacji OAuth (RFC 8414, /.well-known/oauth-authorization-server) byly nieosiagalne z zewnatrz. Klient MCP `bpp-mcp` nie mogl przeprowadzic discovery i logowanie padalo, mimo ze /o/authorize/, /o/token/ i /o/register/ dzialaly poprawnie. Naprawa: `location ^~ /.well-known/` — modyfikator `^~` stawia prefiks ponad regexami. Django odpowiada 404 na nieznane sciezki .well-known, wiec nic sie nie odslania, a .git/.env dalej lapie regex. ACME (Let's Encrypt) nie byl dotkniety: blok port-80 w vhost.conf.template nie includuje _bpp-locations.conf, wiec walidacja HTTP-01 dzialala. Test 15d w tests/test_makefile.sh pilnuje obu stron kontraktu naraz: /.well-known/oauth-authorization-server musi dojsc do appservera, a /.git/config i /.env musza dalej dostawac 403 — zeby "naprawa" polegajaca na skasowaniu blokady plikow ukrytych nie przeszla jako zielona. Zweryfikowane na nginx:1.30.2: przed poprawka 15d pada (403), po poprawce 22/22 zielone, testy ACME bez zmian. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019D6Zytbsj8xjZCx8etyMeN
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
GET https://<host>/.well-known/oauth-authorization-serverzwracał 403 odnginksa na każdym wdrożeniu — mimo że serwer autoryzacji OAuth działał bez
zarzutu:
/o/authorize//accounts/login/✅/o/token//o/register/(DCR)client_id✅/.well-known/oauth-authorization-serverSkutkiem było to, że klient MCP (
bpp-mcp)nie mógł wykonać discovery (RFC 8414) i logowanie padało na pierwszym kroku,
choć całe OAuth było gotowe do użycia.
Przyczyna
_bpp-locations.confblokuje pliki ukryte:To regex, a regexy w nginksie mają pierwszeństwo przed zwykłymi prefiksami.
/.well-known/zaczyna się od kropki, więc wpadał w tę regułę i żadenprefiksowy
locationnie mógł go wyprzedzić.Diagnoza potwierdzona z zewnątrz: losowa ścieżka pod
/.well-known/teżdawała 403 (a nie 404), co dowodzi, że blokuje nginx, a nie Django.
Naprawa
Modyfikator
^~stawia prefiks ponad regexami./.well-known/(RFC 8615)to standardowa przestrzeń metadanych serwisu, a nie „plik ukryty" — leżą tam
metadane OAuth i
security.txt. Django odpowiada 404 na nieznane ścieżki, więcnic się nie odsłania, a
.git/.envdalej łapie regex poniżej.ACME nie był dotknięty
Sprawdzone osobno: po HTTP (port 80)
/.well-known/acme-challenge/zwraca 404,nie 403. Blok port-80 w
vhost.conf.templatenie includuje_bpp-locations.conf, więc reguła tam nie sięgała i walidacja Let's Encryptdziałała przez cały czas.
Test
Nowy blok 15d w istniejącym harnessie
test_nginx_runtime— startujeprawdziwy
nginx:1.30.2z pełnym łańcuchem entrypointów i fake appserverem,po czym sprawdza obie strony kontraktu naraz:
/.well-known/oauth-authorization-servermusi dojść do appservera(asercja na echo ścieżki, nie na samo 200),
/.git/configi/.envmuszą dalej dostawać 403.Druga asercja jest tu kluczowa: bez niej „naprawa" polegająca na skasowaniu
blokady plików ukrytych przechodziłaby jako zielona.
Weryfikacja:
Uwaga wdrożeniowa
Do czasu wdrożenia tej zmiany
bpp-mcpradzi sobie fallbackiem na/o/*(bpp-mcp#…), ale to obejście po stronie
klienta. Natywny przycisk „authorize" w Claude (tryb HTTP) wymaga tej
poprawki — tam discovery robi sam klient Claude i fallbacku nie ma.