Projet

Général

Profil

Bug #14575

rajouter un delai pour la detection d'une authentification réussie ou échouée

Ajouté par Serghei Mihai il y a plus de 7 ans. Mis à jour il y a environ 7 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
-
Version cible:
-
Début:
12 janvier 2017
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

Certaines applications métier (encore Ermes) utilisent du javascript pour construire toute la page.
Le chargement de ces scripts peut être longue et les elements nécessaires à la détection de l'authentification ne sont pas encore chargés quand le page.onLoadFinished est executé.

Un délai d'attente pour l'execution du corps de onLoadFinished permet de regler cela.


Fichiers

0001-add-delay-for-execution-of-onLoadFinished-event.patch (1,03 ko) 0001-add-delay-for-execution-of-onLoadFinished-event.patch Serghei Mihai, 12 janvier 2017 10:35
0001-wait-for-page-loading-to-complete-before-authenticat.patch (3,75 ko) 0001-wait-for-page-loading-to-complete-before-authenticat.patch Serghei Mihai, 12 janvier 2017 16:10
0001-wait-for-page-loading-to-check-authentication-14575.patch (3,99 ko) 0001-wait-for-page-loading-to-check-authentication-14575.patch Serghei Mihai, 27 janvier 2017 15:51
0001-wait-for-page-loading-to-check-authentication-14575.patch (4,4 ko) 0001-wait-for-page-loading-to-check-authentication-14575.patch Serghei Mihai, 06 février 2017 15:44
0001-wait-for-page-loading-to-check-authentication-14575.patch (5,27 ko) 0001-wait-for-page-loading-to-check-authentication-14575.patch Serghei Mihai, 06 février 2017 17:28
0001-wait-for-page-loading-to-check-authentication-14575.patch (5,08 ko) 0001-wait-for-page-loading-to-check-authentication-14575.patch Serghei Mihai, 07 février 2017 16:07
0001-wait-for-page-loading-to-check-authentication-14575.patch (5,03 ko) 0001-wait-for-page-loading-to-check-authentication-14575.patch Serghei Mihai, 07 février 2017 17:23
0001-wait-for-page-loading-to-check-authentication-14575.patch (7,21 ko) 0001-wait-for-page-loading-to-check-authentication-14575.patch Serghei Mihai, 08 février 2017 14:59
0001-wait-for-page-loading-to-check-authentication-14575.patch (5,6 ko) 0001-wait-for-page-loading-to-check-authentication-14575.patch Serghei Mihai, 08 février 2017 18:19

Révisions associées

Révision eee5c873 (diff)
Ajouté par Serghei Mihai il y a environ 7 ans

wait for page loading to check authentication (#14575)

Log an error if both auth success and failure functions return true.

Historique

#1

Mis à jour par Serghei Mihai il y a plus de 7 ans

J'ai testé avec un délai de 400ms et ça fonctionne.

#2

Mis à jour par Frédéric Péters il y a plus de 7 ans

Pas fan, magie trop fragile. Je verrais plutôt la possibilité de définir une fonction qui doit être vraie avant d'avancer (et exécuter cette fonction toutes les 200ms pendant max 2 secondes, par exemple).

#3

Mis à jour par Serghei Mihai il y a plus de 7 ans

Alors je verrais cette fonction dans le auth_checker de l'application qui en as besoin.
Ensuite relance de la fonction de vérification de l'authentification à coup de setInterval.

Je viens de tester sur Ermes et ça fonctionne, mais ça devrait être testé plus sérieusement.

#4

Mis à jour par Frédéric Péters il y a plus de 7 ans

            }
            // check authentication
            check_auth();

Il y a là un problème d'indentation.

Mais sur le fond, quand même, je préférerais qu'un module puisse déclarer sa propre fonction "en état de vérifier l'authent ?", plutôt qu'exécuter le code de vérification de l'authent et de demander à celui-ci de gérer non plus seulement "bon / pas bon" mais également un "ne sais pas trop encore" un peu foireux.

#5

Mis à jour par Serghei Mihai il y a plus de 7 ans

C'est mon idée: le module de l'application dispose d'une fonction supplémentaire en plus de auth_success ou password_change_required qui dit "pas bon" si impossible de vérifier l'authentification.
Et quand c'est bon, ça laisse la main à auth_success et compagnie.

Le nom que je propose dans le patch de plus haut n'est probablement pas terrible, à changer, mais l'idée est la même.

#6

Mis à jour par Frédéric Péters il y a plus de 7 ans

Peut-être que je me perds dans cette nouvelle lecture du patch (c'était il y a dix jours) mais sommairement, là, que l'expiration soit passée (counter > 10) ou que ça soit prêt (loaded), le code de vérification de l'authent est appelé, et doit donc pour moi gérer trois cas (bon / pas bon / oops ça avait pas chargé).

#7

Mis à jour par Frédéric Péters il y a plus de 7 ans

Retour sur la discussion du jour, un peu adapté suite à la lecture du code.

On définit aujourd'hui window.auth_success, on doit pouvoir également définir window.auth_failure. Quand les deux sont présents, s'il n'y a pas un retour positif d'un des deux, on attend un peu genre ¼ de seconde avant de réessayer. (en bout de course si ça n'arrive pas on aura #14606 pour tuer l'affaire).

Aussi, dans les consignes d'écriture de ces fonctions d'évaluations, il faut noter qu'il est mieux de tester l'existence d'un élément, plutôt que l'absence.

ex:

    window.auth_success = function(){
        if ($('#INDEX_TBL_LOGIN').length < 1)
            return true;
        return false;
    }

Retournerait que ça marche en cas de présence de mettons un bug qui retournerait une page blanche; on devrait plutôt avoir l'inverse, genre (en inventant le sélecteur) :

    window.auth_success = function(){
        if ($('#INDEX_TBL_LOGOUT).length)
            return true;
        return false;
    }
#8

Mis à jour par Serghei Mihai il y a environ 7 ans

Patch suivant ce principe (sur l'exemple d'Archimed) mais avec un délai d'attente de 0.1 secondes.

Au passage je découvre que l'evenement onLoadFinished s'execute 2 fois.

#9

Mis à jour par Josué Kouka il y a environ 7 ans

Sur une application comme Ermes, on peut directement taper sur des ws :

 
resp = logged_requests.post('https://mediatheques.montpellier3m.fr/DEFAULT/Ermes/Recherche/logon.svc/logon', data={'username': 'whatever', 'password': 'whatever'})

Reponse en cas d'echec
{"errors":[{"data":{"__type":"ObjectCollection:#Archimed.Serialization","badPasswordCount":1,"doCheckAdditionals":false,"checkAdditionalsResult":true},"id":"TPA6+H6iiIlZT0oyliNXCLuaPkU=","msg":"Le mot de passe saisi est incorrect, vérifiez la syntaxe et réessayez.","type":"InvalidCredentials"}],"message":"","success":false,"d":"Anonymous"}

Je pense qu'avec

Reponse en cas de succès

{"errors":[],"message":"","success":true,"d":"entrouvert"}

Je pense qu'en ajoutant une logique simple appel ws pour les applications utilisant des ws (Fred l'avait évoqué une fois je pense) ça devrait marcher. (je fais le test puis je mets à jour le ticket)

#10

Mis à jour par Serghei Mihai il y a environ 7 ans

Ce que m'embête c'est de devoir gerer les cookies en provenance de requests comme le faisait l'ancien mandaye. Et de mes souvenirs ce n'était pas évident.

L'utilisation de phantomjs semblait apporter la solution de ne plus rien avoir à gerer à ce niveau, juste transférer les cookies.

#11

Mis à jour par Serghei Mihai il y a environ 7 ans

Suite à la discussion de ce matin, patch à jour prenant en compte la définition de la fonction auth_failure dans chaque application.
Testé sur Ermes et Teamnet.

#12

Mis à jour par Frédéric Péters il y a environ 7 ans

Patch absent.

#14

Mis à jour par Frédéric Péters il y a environ 7 ans

Vraiment > 1 et pas >= 1 dans if ($('a.account_logoff').length > 1) et if ($('input[type="password"]#code').length > 1) ?

if (input.auth_failure !== undefined) {
// check authentication failure only if the function is defined
if (!input.auth_success && !input.auth_failure)

Je pense que ça gagnerait à un commentaire bien plus explicite, que le "on fait le taf uniquement si c'est pas undefined" est déjà bien exprimé par la première ligne; que la seconde condition par contre, elle exprime le fait qu'en présence des deux fonctions, si aucune n'est vérifiée, on lache l'affaire et le setInterval viendra rejouer plus tard.

Aussi, sur la situation où on aurait input.auth_success et input.auth_failure, je me dis qu'on doit traiter ça comme une situation d'erreur (et idéalement logguer ça de manière suffisamment critique pour qu'on soit informé parce que ça veut sans doute dire que l'application a changé de comportement).

#15

Mis à jour par Serghei Mihai il y a environ 7 ans

Frédéric Péters a écrit :

Aussi, sur la situation où on aurait input.auth_success et input.auth_failure, je me dis qu'on doit traiter ça comme une situation d'erreur (et idéalement logguer ça de manière suffisamment critique pour qu'on soit informé parce que ça veut sans doute dire que l'application a changé de comportement).

Dans ce cas on doit revoir la façon dont on écrit les messages en sortie de phantom. Actuellement tout va dans stdout qui est lu par le code python et intepreté comme json.
Benj donnait une piste ce matin : https://github.com/ariya/phantomjs/blob/master/examples/stdin-stdout-stderr.js . On devrait passer les messages à logguer dans stderr et le stdout uniquement pour le json à interpreter.

#16

Mis à jour par Frédéric Péters il y a environ 7 ans

Non; à nouveau ne mélangeons pas, pour le micmac de sortie, on a #14881. Ici, je dis qu'il faudrait arrêter le traitement sur une erreur, et que celle-ci soit logguée du côté Python, quand le code affirme que ça a à la fois été un succès et un échec.

#17

Mis à jour par Serghei Mihai il y a environ 7 ans

Ok.

Je vois l'erreur retournée dans le json sous la forme {"result": "error", "reason": "..."} et logguée ensuite.
Message à modifier.

#19

Mis à jour par Serghei Mihai il y a environ 7 ans

Patch refactorisé, principalement la fonction de vérification de l'échec.

#21

Mis à jour par Serghei Mihai il y a environ 7 ans

  • Fichier 0001-wait-for-page-loading-to-check-authentication-14575.patch ajouté

Après des tests sur d'autres projets en prod comme le conservatoire de Vincennes et Teamnet à Meyzieu je découvre que si la fonction auth_failure n'est pas définie pour chaque application (et dans ce cas je lui attribue undefined) phantomjs l'interprete comme null et la condition d'arrêt de la fonction check_auth n'est pas respectée. Cela a comme effet une boucle pour les codes saisis éronnés.

En attendant de trouver une explication et solution à ce phenomène je définis des fonctions auth_failure pour duonet et teamnet.

Testé avec les 3: archimed, duonet et teamnet.

#22

Mis à jour par Frédéric Péters il y a environ 7 ans

Après des tests sur d'autres projets en prod comme le conservatoire de Vincennes et Teamnet à Meyzieu je découvre que si la fonction auth_failure n'est pas définie pour chaque application (et dans ce cas je lui attribue undefined) phantomjs l'interprete comme null et la condition d'arrêt de la fonction check_auth n'est pas respectée. Cela a comme effet une boucle pour les codes saisis éronnés.

Quand même du mal à piger cette explication sans précision sur la condition dont tu parles.

Tu dis que le "return undefined;" du code; quand on passe dedans et bien malgré tout input.auth_failure == null ?

#23

Mis à jour par Serghei Mihai il y a environ 7 ans

  • Fichier 0001-wait-for-page-loading-to-check-authentication-14575.patch supprimé
#25

Mis à jour par Serghei Mihai il y a environ 7 ans

Frédéric Péters a écrit :

Tu dis que le "return undefined;" du code; quand on passe dedans et bien malgré tout input.auth_failure == null ?

C'est ça.
Je detecte ça en voyant le code du if :

if (input.auth_failure !== undefined) {
 ...
}

s'executer.

#26

Mis à jour par Frédéric Péters il y a environ 7 ans

Et donc, pour comprendre, isoler les choses, jouer avec les types, genre :

var page = require('webpage').create();
var input = Object();

page.open('http://localhost', function(status) {
    input.auth_failure = page.evaluate(function(){
       return undefined;
    });
    if (input.auth_failure == true) console.log('==true');
    if (input.auth_failure == false) console.log('==false');
    if (input.auth_failure == undefined) console.log('==undefined');
    if (input.auth_failure == null) console.log('==null');
    if (input.auth_failure === undefined) console.log('===undefined');
    if (input.auth_failure === null) console.log('===null');
    if (input.auth_failure != undefined) console.log('!=undefined');
    if (input.auth_failure != null) console.log('!=null');
    if (input.auth_failure !== undefined) console.log('!==undefined');
    if (input.auth_failure !== null) console.log('!==null');

    phantom.exit();
});

Plutôt que dire "on essaiera plus tard de comprendre".

#27

Mis à jour par Serghei Mihai il y a environ 7 ans

Patch à jour pour gérer le cas d'undefined.

Je modifie également le fichier d'authentification pour Archimed pour qu'il n'attende pas l'evenement onLoad car il attend que tous les scripts de l'application finissent leur boulot et les fonctions retourneront null.

#28

Mis à jour par Frédéric Péters il y a environ 7 ans

        if result.get('error'):
            logger.error('Error occured: %s' % result.get('reason'))

On peut juste logguer le message; "error occured" c'est implicite. (et si la raison seule n'est pas top, on a la main dans le js pour mieux l'écrire).

À part ça, si les tests sont concluants, je me dis qu'on peut y aller.

#29

Mis à jour par Serghei Mihai il y a environ 7 ans

  • Statut changé de En cours à Résolu (à déployer)

Ok.

commit eee5c87346e73431200f9f07d29e7ed45bce3e09
Author: Serghei Mihai <smihai@entrouvert.com>
Date:   Mon Jan 23 16:20:07 2017 +0100

    wait for page loading to check authentication (#14575)

    Log an error if both auth success and failure functions return true.

#30

Mis à jour par Serghei Mihai il y a environ 7 ans

  • Statut changé de Résolu (à déployer) à Fermé

Formats disponibles : Atom PDF