Projet

Général

Profil

Bug #69296

sur un appel à /api/check-password/ TypeError: cannot unpack non-iterable NoneType object

Ajouté par Sentry Io 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:
19 septembre 2022
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

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

Lié à Authentic 2 - Development #69335: api : respecter l'API DRF dans /api/check-password/Solution validée20 septembre 2022

Actions

Révisions associées

Révision 22c8c2cb (diff)
Ajouté par Emmanuel Cazenave il y a plus d'un an

debian: do not load APIClientAuthentication in authentic (#69296)

Historique

#1

Mis à jour par Frédéric Péters il y a plus d'un an

  • Projet changé de Suivi des traces à Hobo
#2

Mis à jour par Emmanuel Cazenave il y a plus d'un an

  • Assigné à mis à Emmanuel Cazenave
#3

Mis à jour par Emmanuel Cazenave il y a plus d'un an

Boulette dans #67085 : hobo.rest_authentication.APIClientAuthentication ne doit pas être chargé pour authentic (qui se débrouille tout seul via #66985, il ne va pas s'interroger lui même alors qu'il a les objets APIClient dans sa base de donnée).

#4

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)

#5

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

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

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.

#7

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.

#8

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

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

Mis à jour par Emmanuel Cazenave il y a plus d'un an

#11

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

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

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

Automatic expiration

Formats disponibles : Atom PDF