Development #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.
Fichiers
Demandes liées
Révisions associées
Historique
Mis à jour par Valentin Deniaud il y a plus d'un an
- Lié à Support #69085: Sur un POST d'API, lever une erreur quand un slash final manque au lieu de rediriger ? ajouté
Mis à jour par Valentin Deniaud il y a plus d'un an
- Fichier 0001-middleware-subclass-common-middleware-to-avoid-redir.patch 0001-middleware-subclass-common-middleware-to-avoid-redir.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
Mis à jour par Benjamin Dauvergne il y a plus d'un an
- Statut changé de Solution proposée à En cours
Mis à jour par Valentin Deniaud il y a plus d'un an
- Fichier 0001-middleware-subclass-common-middleware-to-avoid-redir.patch 0001-middleware-subclass-common-middleware-to-avoid-redir.patch ajouté
- Statut changé de En cours à 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é.
Mis à jour par Benjamin Dauvergne il y a plus d'un an
- Statut changé de Solution proposée à 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.
Mis à jour par Valentin Deniaud il y a plus d'un an
- Statut changé de Solution validée à 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)
Mis à jour par Transition automatique il y a plus d'un an
- Statut changé de Résolu (à déployer) à Solution déployée
Mis à jour par Valentin Deniaud il y a plus d'un an
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.
Mis à jour par Benjamin Dauvergne il y a plus d'un an
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).
Mis à jour par Valentin Deniaud il y a plus d'un an
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
?
Mis à jour par Benjamin Dauvergne il y a plus d'un an
Non j'ai juste fait un reload en plus, via le script init.d.
Mis à jour par Benjamin Dauvergne il y a plus d'un an
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
Mis à jour par Valentin Deniaud il y a plus d'un an
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)