Bug #69296
sur un appel à /api/check-password/ TypeError: cannot unpack non-iterable NoneType object
0%
Description
https://sentry.entrouvert.org/entrouvert/publik/issues/94127/ mais la valeur de authenticator y est cachée,
TypeError: cannot unpack non-iterable NoneType object (8 additional frame(s) were not displayed) ... File "rest_framework/views.py", line 469, in handle_exception self.raise_uncaught_exception(exc) File "rest_framework/views.py", line 480, in raise_uncaught_exception raise exc File "rest_framework/views.py", line 506, in dispatch response = handler(request, *args, **kwargs) File "authentic2/api_views.py", line 189, in post response, response_status = self.rpc(request, serializer) File "authentic2/api_views.py", line 1399, in rpc user, dummy_oidc_client = authenticator.authenticate_credentials(
Dans la trace par email on voit <hobo.rest_authentication.APIClientAuthentication object at 0x7fd4a0df18b0>.
Dans le code on a en effet des moments avec "return None" alors que deux valeurs sont attendues.
Fichiers
Demandes liées
Révisions associées
Historique
Mis à jour par Emmanuel Cazenave il y a plus d'un an
- Fichier 0001-debian-do-not-load-APIClientAuthentication-in-authen.patch 0001-debian-do-not-load-APIClientAuthentication-in-authen.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
Mis à jour par Frédéric Péters il y a plus d'un an
Reste que authenticate_credentials est supposé retourner un tuple; dans DRF :
def _authenticate(self): """ Attempt to authenticate the request using each authentication instance in turn. """ for authenticator in self.authenticators: try: user_auth_tuple = authenticator.authenticate(self)
(le .authenticate() amenant derrière un appel/retour à authenticate_credentials)
Mis à jour par Benjamin Dauvergne il y a plus d'un an
- Statut changé de Solution proposée à En cours
Mis à jour par Emmanuel Cazenave il y a plus d'un an
- Statut changé de En cours à Solution proposée
Frédéric Péters a écrit :
Reste que authenticate_credentials est supposé retourner un tuple; dans DRF :
J'avais regardé ça et j'en avais pas fait la même lecture (et toujours pas aujourd'hui):
def _authenticate(self): """ Attempt to authenticate the request using each authentication instance in turn. """ for authenticator in self.authenticators: try: user_auth_tuple = authenticator.authenticate(self) except exceptions.APIException: self._not_authenticated() raise if user_auth_tuple is not None: self._authenticator = authenticator self.user, self.auth = user_auth_tuple return self._not_authenticated()
Que authenticate renvoie None c'est le pattern pour permettre de passer à l'authenticator suivant.
Alors ok je peux lever une exception dans authenticate_credentials au lieu de renvoyer None, et ainsi interrompre l'itération sur les authenticators mais je vois pas l’intérêt. Je m'étais inspiré de PublikAuthentication.authenticate
qui renvoie None s'il ne voit pas de signature dans la requête.
Mis à jour par Benjamin Dauvergne il y a plus d'un an
D'ac alors c'est le code d'authentic qu'il faut corriger, même si ta correction aux settings est bonne, ça ne suit pas l'API DRF.
Mis à jour par Frédéric Péters il y a plus d'un an
- Statut changé de Solution proposée à Solution validée
Curieux d'avoir aucune utilisation de cette possibilité de "sauter" un authenticator dans djangorestframework mais ok en effet, et ça ne doit pas poser trop de soucis de manière globale vu que déjà pour l'authentification par signature on faisait ça,
def authenticate(self, request): full_path = request.get_full_path() if not request.GET.get('orig') or not request.GET.get('signature'): return None
Mis à jour par Emmanuel Cazenave il y a plus d'un an
- Statut changé de Solution validée à Résolu (à déployer)
commit 22c8c2cb896f71e4b12655d5580714763cc9ae82 Author: Emmanuel Cazenave <ecazenave@entrouvert.com> Date: Tue Sep 20 12:27:44 2022 +0200 debian: do not load APIClientAuthentication in authentic (#69296)
Mis à jour par Emmanuel Cazenave il y a plus d'un an
- Lié à Development #69335: api : respecter l'API DRF dans /api/check-password/ ajouté
Mis à jour par Transition automatique il y a plus d'un an
- Statut changé de Résolu (à déployer) à Solution déployée
debian: do not load APIClientAuthentication in authentic (#69296)