Project

General

Profile

Développement #69409

ajout d'un middleware pour désactiver append_slash sur un POST d'API

Added by Valentin Deniaud about 2 years ago. Updated about 2 years ago.

Status:
Fermé
Priority:
Normal
Category:
-
Target version:
-
Start date:
21 September 2022
Due date:
% Done:

0%

Estimated time:
Patch proposed:
Yes
Planning:
No

Description

En héritant du CommonMiddleware de Django, et à activer partout ensuite.


Files


Related issues

Related to Publik - Support #69085: Sur un POST d'API, lever une erreur quand un slash final manque au lieu de rediriger ?Fermé14 September 2022

Actions

Associated revisions

Revision 5470d008 (diff)
Added by Valentin Deniaud about 2 years ago

middleware: subclass common middleware to avoid redirects in API (#69409)

History

#1

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
#2

Updated by Valentin Deniaud about 2 years ago

#3

Updated by Benjamin Dauvergne about 2 years ago

  • Status changed from Solution proposée to En cours
#4

Updated by Valentin Deniaud about 2 years ago

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é.

#5

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.

#6

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)
#7

Updated by Transition automatique about 2 years ago

  • Status changed from Résolu (à déployer) to Solution déployée
#8

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.

#9

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).

#10

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 ?

#11

Updated by Benjamin Dauvergne about 2 years ago

Non j'ai juste fait un reload en plus, via le script init.d.

#12

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

#13

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 !

#14

Updated by Transition automatique almost 2 years ago

Automatic expiration

Also available in: Atom PDF