Développement #69409
ajout d'un middleware pour désactiver append_slash sur un POST d'API
0%
Description
En héritant du CommonMiddleware de Django, et à activer partout ensuite.
Files
Related issues
Associated revisions
History
Updated by Valentin Deniaud about 2 years ago
- Related to Support #69085: Sur un POST d'API, lever une erreur quand un slash final manque au lieu de rediriger ? added
Updated by Valentin Deniaud about 2 years ago
- File 0001-middleware-subclass-common-middleware-to-avoid-redir.patch 0001-middleware-subclass-common-middleware-to-avoid-redir.patch added
- Status changed from Nouveau to Solution proposée
- Patch proposed changed from No to Yes
Updated by Benjamin Dauvergne about 2 years ago
- Status changed from Solution proposée to En cours
Updated by Valentin Deniaud about 2 years ago
- File 0001-middleware-subclass-common-middleware-to-avoid-redir.patch 0001-middleware-subclass-common-middleware-to-avoid-redir.patch added
- Status changed from En cours to Solution proposée
Petite bizarrerie dans les tests, ça foire sur une erreur CSRF sur jenkins (pas en local), du coup désactivation du CSRF (documenté ici https://github.com/django-webtest/django-webtest/blob/master/README.rst#usage-with-pytest) mais django-webtest transforme le setting MIDDLEWARES en liste, d'où la modif à test_version_middleware...
À part ça marche nickel, testé pour de vrai sur le cas d'usage du ticket lié.
Updated by Benjamin Dauvergne about 2 years ago
- Status changed from Solution proposée to Solution validée
Valentin Deniaud a écrit :
Petite bizarrerie dans les tests, ça foire sur une erreur CSRF sur jenkins (pas en local), du coup désactivation du CSRF (documenté ici https://github.com/django-webtest/django-webtest/blob/master/README.rst#usage-with-pytest) mais django-webtest transforme le setting MIDDLEWARES en liste, d'où la modif à test_version_middleware...
Ça parait normal que le check CSRF s'active sur un POST vers une vue d'API qui n'est pas prévue pour, le comportement est comme cela partout :
$ http POST https://hobo-hautes-alpes.test.entrouvert.org/api/health/ HTTP/1.1 403 Forbidden ...
Tu dois avoir quelque chose qui désactive le check CSRF dans ta configuration locale.
Updated by Valentin Deniaud about 2 years ago
- Status changed from Solution validée to Résolu (à déployer)
commit 5470d0083e3cd313e7dd003d56f8671c4ec8989e Author: Valentin Deniaud <vdeniaud@entrouvert.com> Date: Mon Sep 26 14:01:30 2022 +0200 middleware: subclass common middleware to avoid redirects in API (#69409)
Updated by Transition automatique about 2 years ago
- Status changed from Résolu (à déployer) to Solution déployée
Updated by Valentin Deniaud about 2 years ago
Raté, ça ne fonctionne pas, on se prend toujours la redirection au lieu de l'erreur.
Pourtant en local, même version de Django, tout roule...
Taper settings.MIDDLEWARE
dans un shell sur la recette montre bien que le CommonMiddleware de Django a été remplacé par celui de hobo.
J'ai tapé un restart au cas où, ça n'a rien changé (je teste sur l'API role d'authentic).
Je verrais demain pour pousser davantage les investigations.
Updated by Benjamin Dauvergne about 2 years ago
J'ai relancé authentic sur test-hds et ça sembler marcher :
$ http -v POST https://connexion-hautes-alpes.test.entrouvert.org/api/users POST /api/users HTTP/1.1 Accept: */* Accept-Encoding: gzip, deflate, br Connection: keep-alive Content-Length: 0 Host: connexion-hautes-alpes.test.entrouvert.org User-Agent: HTTPie/3.2.1 HTTP/1.1 404 Not Found content-type: application/json date: Wed, 28 Sep 2022 18:25:51 GMT set-cookie: cookie-test=1; expires=Thu, 28 Sep 2023 18:25:51 GMT; Max-Age=31536000; Path=/; SameSite=Lax strict-transport-security: max-age=15768000 transfer-encoding: chunked { "err": 1, "err_desc": "URL must end with a slash." }
Note que si DEBUG est activé, ça lève une exception qui n'est pas gérée (et je pense qu'on peut laisser ça comme ça).
Updated by Valentin Deniaud about 2 years ago
Cool, par contre le même test sur la recette normale ne fonctionne pas :
➜ ~ http -v POST https://connexion-validation.test.entrouvert.org/api/users POST /api/users HTTP/1.1 Accept: */* Accept-Encoding: gzip, deflate, br Connection: keep-alive Content-Length: 0 Host: connexion-validation.test.entrouvert.org User-Agent: HTTPie/3.2.1 HTTP/1.1 301 Moved Permanently content-length: 0 content-type: text/html; charset=utf-8 date: Thu, 29 Sep 2022 07:45:01 GMT location: /api/users/ permissions-policy: interest-cohort=() set-cookie: cookie-test=1; expires=Fri, 29 Sep 2023 07:45:01 GMT; Max-Age=31536000; Path=/; SameSite=Lax strict-transport-security: max-age=63072000 x-content-type-options: nosniff x-xss-protection: 1; mode=block
Tu as fait quelque chose à part systemctl restart authentic2-multitenant
?
Updated by Benjamin Dauvergne about 2 years ago
Non j'ai juste fait un reload en plus, via le script init.d.
Updated by Benjamin Dauvergne about 2 years ago
Je viens de faire un restart sur les deux noeuds et ça marche :
$ http -v POST https://connexion-validation.test.entrouvert.org/api/users POST /api/users HTTP/1.1 Accept: */* Accept-Encoding: gzip, deflate, br Connection: keep-alive Content-Length: 0 Host: connexion-validation.test.entrouvert.org User-Agent: HTTPie/3.2.1 HTTP/1.1 404 Not Found content-type: application/json date: Thu, 29 Sep 2022 13:13:15 GMT permissions-policy: interest-cohort=() set-cookie: cookie-test=1; expires=Fri, 29 Sep 2023 13:13:15 GMT; Max-Age=31536000; Path=/; SameSite=Lax strict-transport-security: max-age=63072000 transfer-encoding: chunked { "err": 1, "err_desc": "URL must end with a slash." }
T'es sûr de bien faire restart/reload sur les deux noeuds ? ou alors systemctl déconne...
PS: restart via init.d toujours
Updated by Valentin Deniaud about 2 years ago
Benjamin Dauvergne a écrit :
T'es sûr de bien faire restart/reload sur les deux noeuds ? ou alors systemctl déconne...
J'oublie toujours ces affaires de nœuds, merci ça fonctionne aussi de mon côté maintenant !
middleware: subclass common middleware to avoid redirects in API (#69409)