EduWireApps / ynotes

Application open source de vie scolaire étudiante NOT MAINTAINED
https://ynotes.fr/
Other
72 stars 11 forks source link

Ajout d'ENT #8

Closed lucas-luchack closed 3 years ago

lucas-luchack commented 3 years ago

Bonjour, L'application à l'aire excellente mais il manque cruellement de possibilité pour s'y connecter. La majorité des établissement utilise des ENT pour gérer les différentes offices dont Pronote. C'est pourquoi il faudrait rajouter le support des CAS du gouvernement.

Les CAS des académies fonctionnent tous de la même façon (à part celui de Bordeaux puisqu'il propose plusieurs services de connexion différents). Tous les CAS utilise ATEN pour gérer les connections c'est à dire, les même base pour les URL, les mêmes requêtes à effectuer et les même informations à fournir.

Cela signifie qu'implémenter une seule académie reviendrait à implémenter toutes les académies (enfin la base du fonctionnement).

Je pense que créer une requête commune à ATEN faciliterai la tache, ensuite il faut juste choisir l'ENT que l'on souhaite utiliser et modifier deux valeurs pour que la connexion marche.

Petit exemple :

url,
username,
password,

startURL: '/sso/SSO?SPEntityID=https%3A%2F%2Fmon.lyceeconnecte.fr%2Fauth%2Fsaml%2Fmetadata%2Fidp.xml',
atenURL: 'bv.ac-bordeaux.fr'

Les valeurs à retourner lors de la requêtes sont url, username, password. startURL est la suite de l'URL qui change en fonction des académies pour redirigé vers les services voulus (ici Lycée Connecté) atenURL est le nom de domaine du service de connexion.

Lycée Connecté est un ENT open-source qui est aussi utilisé sur ent.iledefrance.fr et bien d'autre.

Ce qui fait que l'académie de Bordeaux et différente c'est qu'elle a aussi un ENT pour les collégiens à une URL différente : startURL: /sso/SSO?SPEntityID=https://ent2d.ac-bordeaux.fr/shibboleth atenURL: idp-fim-ts.ac-bordeaux.fr

Aussi aujourd'hui EduConnect est beaucoup utilisé, encore une fois il suffit de développer une fois la connexion pour EduConnect pour faire marcher pas mal d'ENT.

J'ai essayé de bricoler la connexion vers Lycée Connecté avec l'académie de Bordeaux mais je ne sais pas ce que ça donne :

ac_bordeaux_1(String username, String password, String url) async {
    var headers = {
        'connection': 'keep-alive',
        'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:73.0) Gecko/20100101 Firefox/73.0'
    };

    final client = HttpClient();
    // ignore: close_sinks
    final request = await client.getUrl(Uri.parse(url));
    request.headers.set(HttpHeaders.contentTypeHeader, "plain/text");
    request.followRedirects = false;
    final response = await request.close();
    //Get location from headers
    String redirectedUrl = response.headers.value(HttpHeaders.locationHeader);
    String service = Uri.encodeComponent(url);

    String ent_login = "https://bv.ac-bordeaux.fr/login/ct_logon_vk.jsp?CT_ORIG_URL=http%3A%2F%2Fbv.ac-bordeaux.fr%2Fsso%2FSSO%3FSPEntityID%3Dhttps%253A%252F%252Fmon.lyceeconnecte.fr%252Fauth%252Fsaml%252Fmetadata%252Fidp.xml";
    String ent_verif = "https://bv.ac-bordeaux.fr/aten-web/connexion/controlesConnexion?CT_ORIG_URL=http%3A%2F%2Fbv.ac-bordeaux.fr%2Fsso%2FSSO%3FSPEntityID%3Dhttps%253A%252F%252Fmon.lyceeconnecte.fr%252Fauth%252Fsaml%252Fmetadata%252Fidp.xml"

    //remove old cookies
    await Requests.clearStoredCookies(Requests.getHostname(ent_login));
    //payload to send
    var payload = {
        "username": username,
        "password": password,
        "auth_mode": 'BASIC',
        "orig_url": '/sso/SSO?SPEntityID=https%3A%2F%2Fmon.lyceeconnecte.fr%2Fauth%2Fsaml%2Fmetadata%2Fidp.xml',
    };
    print(payload);
    var response2 = await Requests.post(ent_login, body: payload, persistCookies: true, bodyEncoding: RequestBodyEncoding.FormURLEncoded);

    if (response2.content().contains("Identifiant ou mot de passe incorrect")) {
        throw "runes";
    }
    var cookies = await Requests.getStoredCookies(Requests.getHostname(ent_login));
    printWrapped(cookies.toString());
    return cookies;
}

Sinon vous pouvez vous appuyer sur le code qu'il y a dans PronotePy avec l'ENT de Montpellier qui fonctionne avec ATEN.

Vous pouvez aussi vous appuyez sur une api en javascript par Litarvan, ici pour la base d'ATEN et ici avec le bout de code à modifier pour les différents ENT d'académies

Je vous souhaite une bonne journée, si vous avez besoin de quoi que ce soit pour le code ou d'information sur ATEN ou si vous avez besoin d'essayer la connexion vers l'ENT. En attendant de vos nouvelles.

JsonLinesCode commented 3 years ago

Bonsoir Lucas, en fait yNotes est une recopie de l'API de Bain (PronotePy) que vous avez cité, je n'ai cependant pas entièrement recopié la partie des CAS (je n'en ai intégré qu'un seul en réalité). Pour l'instant je suis en pleine préparation de la 0.9 et je suis plus penché sur l'api de EcoleDirecte que celle de Pronote. La partie qui traite d'ATEN m'intéresse, y-a-t-il un moyen d'obtenir toutes les URL facilement ? Ou il faudrait réaliser un listing de toutes les URL possibles ? Merci de l'intérêt que vous portez à l'app !

lucas-luchack commented 3 years ago

Pour ATEN il faut malheureusement faire un listing mais Litarvan l'a déjà fait donc nous avons déjà la liste des URLs, après il faut créer le code pour la connexion. Le mieux je pense et de faire un fichier par CAS pour que ce soit plus clair et facile à édité ensuite. Ici la liste des académies (ac-*)

Certaines académies utilise une page entre la connexion avec ATEN et le choix du type de personnel, et d'autre comme les académies en Auvergne Rhône Alpes utilise leur propre service. Encore une fois Litarvan a fait tout le travail il y a juste à récupérer les URLs et les requêtes à effectuer.

J'ai retrouver le nom de l'autre ENT, c'est Open ENT, idem pour lui le code sera le même qu'importe la page de connexion. Il faut juste faire le listing de ce qui l'utilise. On a de la chance sur la page d'Open ENT il y a la liste des ENT avec l'URL donc pour ça, c'est bon. (Utilisé par les régions en général donc pour les lycées)

JsonLinesCode commented 3 years ago

Très bien, je n'ai pas spécialement le temps de m'occuper de Pronote en ce moment, mais vous pouvez très bien effectuer une pull request avec une proposition de code pour ajouter les CAS ! J'espère pouvoir regarder ça début 2021 sinon.

lucas-luchack commented 3 years ago

Très bien, je vais regarder ce que je peut faire pour les ajouts de CAS.

Il faudra juste que je test avant de faire une pr et donc je compile l'App 😅

J'ai déjà commencé à ajouter quelques ENT sur mon fork.

lucas-luchack commented 3 years ago

@ModernChocolate pouvez vous créer une branche ENT ou je peux faire mes PR sur master ?

JsonLinesCode commented 3 years ago

Bonjour ! Je suis en train d'implémenter les CAS en reproduisant la connexion depuis l'application mobile officielle Pronote. C'est à dire en ouvrant une webview et en laissant l'utilisateur se connecter depuis l'interface officielle, puis en injectant deux trois méthodes dans le js. Cette méthode est normalement universelle et fonctionne sur tous les CAS. Je jetterai cependant un oeil à votre travail.