Projet

Général

Profil

Development #69409

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

Ajouté par Valentin Deniaud il y a plus d'un an. Mis à jour il y a plus d'un an.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
-
Version cible:
-
Début:
21 septembre 2022
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

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


Fichiers


Demandes liées

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

Actions

Révisions associées

Révision 5470d008 (diff)
Ajouté par Valentin Deniaud il y a plus d'un an

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

Historique

#1

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

Mis à jour par Valentin Deniaud il y a plus d'un an

#3

Mis à jour par Benjamin Dauvergne il y a plus d'un an

  • Statut changé de Solution proposée à En cours
#4

Mis à jour par Valentin Deniaud il y a plus d'un an

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

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.

#6

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

Mis à jour par Transition automatique il y a plus d'un an

  • Statut changé de Résolu (à déployer) à Solution déployée
#8

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.

#9

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

#10

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 ?

#11

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.

#12

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

#13

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 !

#14

Mis à jour par Transition automatique il y a plus d'un an

Automatic expiration

Formats disponibles : Atom PDF