auth_oidc: avoid user messages with prompt=none related errors (#72538) #38
No reviewers
Labels
No Label
No Milestone
No Assignees
2 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: entrouvert/authentic#38
Loading…
Reference in New Issue
No description provided.
Delete Branch "wip/72538-auth-oidc-prompt-none-error"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Le ticket est déjà validé mais à la relecture on m’a demandé une PR avec la version rebasée de la branche. La voici.
Je déplace ici ma remarque du ticket #73669 parce qu'en fait c'est ici que ça se joue.
Et je rajoute le patch fourni sur la PR-39 initialement qui permet de conserver le paramètre prompt au cours du processus de SSO.
@ -343,3 +328,1 @@
)
else:
message = _('Login with OpenID Connect failed, report %s to an administrator. (%(error)s)')
if error not in (
Remplace ça par un check sur prompt=none, plus général et plus pertinent dans le sens où on se décide par rapport à ce que le RP a demandé et pas uniquement par rapport
85fa18ebd8
to03f6f9e711
03f6f9e711
tofea0568936
fea0568936
to568a2bd8ac
568a2bd8ac
to5a93ac1739
5a93ac1739
to94345c6be9
Merci pour la relecture, j’ai mis à jour la branche en conséquence.
@ -162,3 +162,2 @@
@classmethod
def record(cls, *, service, username, user, reason=None):
super().record(user=user, service=service, data={'username': username, 'reason': reason})
def record(cls, *, service, username=None, user=None, reason=None, authn_type=None, errmsg=None):
Vu qu'on a des objets Authenticator , plutôt que authn_type j'aurai bien mis un authenticator_pk, ça permettra d'avoir une vue sur les erreurs d'un authenticateur dans l'admin, de les compter, etc...
À voir ensuite dans get_message pour produire un truc intelligible juste avec le type de l'authenticateur (si les messages ne sont pas magnifiques ça n'est pas bien grave).
Et vu que c'est un objet en base tu peux juste le passer comme objet en référence. Aussi reason n'est pas utilisé ici, ne pas l'introduire, dans data on doit juste avoir username et/ou error.
La signature finale ce serait
record(cls, *, service, username=None, authenticator=None, error=None)
.Merci, c’est corrigé dans la branche.
J’ai laissé
reason
dans la signature, parce que cet argument pré-existe au patch (et que d’ailleurs il est utilisé pour la journalisation des erreurs de login dans l’authentification par mot de passe local).Ok pour reason, alors c'est error qui pourrait dégager, y en a un en trop de toute façon.
94345c6be9
tobc947852b5
bc947852b5
to478bfee3fa
@ -162,3 +162,2 @@
@classmethod
def record(cls, *, service, username, user, reason=None):
super().record(user=user, service=service, data={'username': username, 'reason': reason})
def record(cls, *, service, username=None, user=None, reason=None, authenticator=None, error=None):
Virer error ne garder que reason, ça fait doublon.
@ -165,0 +167,4 @@
data={
'username': username,
'reason': reason,
'authenticator': authenticator.name if authenticator else None,
Ne pas mettre authenticator dans data mais dans references, sinon on ne peut pas facilement faire de requête en base.
@ -165,3 +173,4 @@
)
@classmethod
def get_message(cls, event, context):
et là 👍
au lieu de regarder dans data.
C’est fait dans la branche, mais visiblement le prefetch des références lors de l’affichage du journal se passe mal : https://jenkins.entrouvert.org/job/gitea/job/authentic/job/wip%252F72538-auth-oidc-prompt-none-error/11/console
Je ne connais pas ce code, je ne sais pas si c’est du au fait que dans le type d’événement on sait seulement qu’on a un BaseAuthenticator, mais que dans les appels à la journalisation c’est une de ses classes filles, et que par conséquent les ContentTypes ne concordent pas.
Bref ça marche pas en l’état, et j’ai un peu la flemme de déboguer
EventQuerySet.prefetch_references
pour comprendre ce qui ne va pas, alors que cette PR au départ se limite aux messages affichés à l’usager sur les retours d’erreur de connexion OIDC…Il faut juste caster l'authenticateur pour avoir le bon content-type, donc
references=[authenticator.baseauthenticator_ptr]
.Ok oui en effet, bien vu. C’était ça et la nécessité d’ajouter l’authentificateur à chaque enregistrement d’un événement de type échec de connexion partout dans le code a2. J’en ai profité pour modifier la signature de la fonction pour ne pas donner de valeur nulle par défaut à l’authentificateur.
Le seul truc qui m’embête, c’est que sur les instances il y a déjà des événements de type échec de connexion, sauf référence vers un authentificateur. Il faut que je corrige le truc qui fait que ça crashe dans le manage lorsqu’on essaie d’afficher un tel événement.
Et en fait non, mauvaise connaissance de l’interface de gestion des événements et du passage d’objet en référence, je cherchais par erreur à en créer un avec
references=[None]
.La PR est bonne pour relecture.
8d758775a5
to261c5647e9