{"info":{"_postman_id":"311847ff-142b-4e19-932c-96939b5072d9","name":"Connecteur LaVieScolaire","description":"<html><head></head><body><p>Cette collection permet d'experimenter et de tester le connecteur vers l'API de La-vie-scolaire.fr.</p>\n<h2 id=\"documentation-ode\">Documentation ODE</h2>\n<ul>\n<li>Confluence : <a href=\"https://opendigitaleducation.atlassian.net/wiki/spaces/PUBLIC/pages/1007419629/Connecteur+LaVieScolaire\">Connecteurs LaVieScolaire</a></li>\n<li>Google Drive : <a href=\"https://drive.google.com/open?id=1bc46En3UkyKc96NksPdF8HnnRoVYmpLY\">LVS-STD-Mise en place connexion SSO</a></li>\n<li>Dépôt GitHub : <a href=\"https://github.com/OPEN-ENT-NG/fake-sso\">OPEN-ENT-NG / fake-sso</a></li>\n</ul>\n<h2 id=\"contexte\">Contexte</h2>\n<ul>\n<li>La vie scolaire est le serveur web <a href=\"http://laviescolaire.fr\">http://laviescolaire.fr</a>.</li>\n<li>L’accès au comptes des utilisateurs est découpé en <strong>établissements</strong>*. Un établissement est un <strong>sous-domaine</strong> du serveur (voir schéma ci-après).</li>\n<li>Un compte est décrit avec un profil. Un profil est soit un 🟠<strong>eleve</strong>, un 🔵 <strong>responsable</strong>, ou un 🟢 <strong>professeur</strong>.</li>\n<li>La vie scolaire identifie un compte spécifique en combinant le <strong>nom</strong>, <strong>prénom</strong>, <strong>profil</strong> et <strong>la date de naissance</strong> d’un utilisateur. L’identification échoue si l’on ne fournit pas ces données, si l’une des informations est inexacte (par exemple Laurent Boudaud a un profil <em>responsable</em> au lieu de <em>professeur</em>) ou qu’ils ne permettent pas de déterminer un compte existant.</li>\n</ul>\n<h2 id=\"methode-de-connexion\">Methode de connexion</h2>\n<p>La connexion au serveur peut être faite selon 3 méthodes :</p>\n<ol>\n<li><strong>SSO RSA</strong> (dit Fake-SSO, choisit) : Le client utilise un ensemble d'information sur un utilisateur et un ticket du serveur pour générer un identifiant chiffré que le serveur va reconnaitre pour identifier l’utilisateur.</li>\n<li><strong>SSO CAS</strong> : Le client et le serveurs utilise une autorité pour identifier un utilisateur des deux plateformes.</li>\n<li><strong>Manuelle</strong> : Autrement, ou en cas d'échec de la négociation, l’utilisateur devra se connecter lui-même en utilisant les identifiants de son compte LaVieScolaire.</li>\n</ol>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[],"owner":"9731080","collectionId":"311847ff-142b-4e19-932c-96939b5072d9","publishedId":"SWT8geoH","public":true,"customColor":{"top-bar":"2A9CC8","right-sidebar":"F9F9F9","highlight":"FF8500"},"publishDate":"2020-01-24T18:20:40.000Z"},"item":[{"name":"Méthode SSO RSA","item":[{"name":"Ticket RSA","event":[{"listen":"test","script":{"id":"04821994-3a35-4ece-abb5-bbe664394a59","exec":["//Post request script","if (pm.response.to.have.status(200)) {","    pm.environment.set(\"ticket\", responseBody);","}","    "],"type":"text/javascript"}}],"id":"093fb0a5-ffbb-4547-87b2-c7ebc4ea3c40","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://{{url_etablissement}}/vsn.main/autoLoginTicketSession/getTicket/","description":"<p>Génère un <strong>ticket de session</strong> auprès de l'établissement <em>LaVieScolaire</em> sélectionné, valable 30 secondes. Le client doit ensuite fournir les informations de l'utilisateur pour le connecter.</p>\n","urlObject":{"protocol":"https","path":["vsn.main","autoLoginTicketSession","getTicket",""],"host":["{{url_etablissement}}"],"query":[],"variable":[]}},"response":[{"id":"acc52b7f-aec0-4f2d-bf3e-5af5f9fcbf99","name":"Obtenir un ticket RSA valable 30 secondes","originalRequest":{"method":"GET","header":[],"url":"https://{{url_etablissement}}/vsn.main/autoLoginTicketSession/getTicket/"},"status":"OK","code":200,"_postman_previewlanguage":"html","header":[{"key":"Server","value":"nginx"},{"key":"Date","value":"Fri, 24 Jan 2020 15:15:14 GMT"},{"key":"Content-Type","value":"text/html;charset=utf-8"},{"key":"Transfer-Encoding","value":"chunked"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=20"},{"key":"Vary","value":"Accept-Encoding"},{"key":"Vary","value":"Accept-Encoding"},{"key":"P3P","value":"policyref=\"/w3c/p3p.xml\", CP=\"NON CUR ADM OUR STP STA\""},{"key":"Strict-Transport-Security","value":"max-age=3456000"},{"key":"Content-Encoding","value":"gzip"}],"cookie":[],"responseTime":null,"body":"2c8acb42c34ccf3cf9d6d38795b04e88"}],"_postman_id":"093fb0a5-ffbb-4547-87b2-c7ebc4ea3c40"},{"name":"Connexion d'un utilisateur","event":[{"listen":"prerequest","script":{"id":"33549d44-9c9f-40ae-af1b-d65dace8130e","exec":["// Récupère les données en vue de les chiffrer et les donner au serveur LVS","","// jeu de donnée d'un utilisateur (à variabilisier qqpart)","let user = { ","    \"id\" : \"sso.professeur\",","    \"profil\" : \"professeur\",","    \"nom\" : \"Professeur\",","    \"prenom\" : \"sso\", ","    \"dtn\" : \"13/07/2012\"","};","// Fonction String Builder qui génère la fin d'url attendu par LVS.","function concatenateToUrl(appli, user, ticket) {","    return `entPersonneJointure=${user.id}&appli=${appli}&profil=${user.profil}&nom=${user.nom}&prenom=${user.prenom}&dtn=${user.dtn}&ticket=${ticket}`;","}","","// Clé RSA public de LVS (depuis les variables globales)","let rsa = pm.globals.get(\"rsaLVS\");","//console.log(\"Clef RSA utilisée: \" + rsa);","","// instanciations nécessaire à la lib.","var navigator = {};","var window = {};","","// import lib. jsrsasign-all-min.js pour l'utiliser ","if(!pm.globals.has(\"rsaLibrary\")){","    ","    pm.sendRequest(\"https://kjur.github.io/jsrsasign/jsrsasign-all-min.js\", function (err, res) {","","    if (err){","        console.log(err);","    }","    else {","        pm.globals.set(\"rsaLibrary\", res.text());","    }});","}","eval(postman.getGlobalVariable(\"rsaLibrary\"));","","","// Prepare URL avec les données qu'on à","url = concatenateToUrl(pm.environment.get(\"appli\"), user, pm.environment.get(\"ticket\"));","console.log(\"URL à digérer : \" + url);","","","// Digestion","try {","    // Objectifie le string RSA","    let key = KEYUTIL.getKey(rsa);","    // Chiffre l'URL + clé","    var jsrsa = KJUR.crypto.Cipher.encrypt(url, key);","    ","} catch(err) {","    console.error(err);","}","","var chaine = encodeURIComponent(btoa( jsrsa));","console.log(\"chaine chiffrée : \" + chaine);","","pm.environment.set(\"chaine_cryptee\", chaine);","","","","","","",""],"type":"text/javascript"}}],"id":"ad0ad70d-a4bb-46a2-a3ca-5a900ca37fc0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://{{url_etablissement}}/vsn.main/?extautolog={{chaine_cryptee}}","description":"<p>Chiffre préalablement les données de l'utilisateur avec la clef RSA de LVS avant de faire la connexion, puis connecte un utilisateur donné à l'établissement LaVieScolaire donné.  </p>\n<p><code>{chaine chiffré}</code> est le résultat du chiffrage RSA d’une chaine comprenant les éléments suivantes :</p>\n<ul>\n<li><code>{id de l’utilisateur}</code> l’identifiant de l’utilisateur chez l’ENT</li>\n<li><code>{client}</code> Identifiant de l’ENT</li>\n<li><code>{profil}</code></li>\n<li><code>{nom}</code></li>\n<li><code>{prénom}</code></li>\n<li><code>{date de naissance}</code></li>\n<li><code>{ticket}</code> le ticket obtenu via <strong>GET Ticket RSA</strong></li>\n<li><code>{clef publique}</code> la clé RSA de LVS.</li>\n</ul>\n<p>Remarques : </p>\n<ul>\n<li>La commande ne fonctionne pas pour le moment, et fait planter le serveur LVS (500 Internal Error)</li>\n<li>La requête a besoin d'un ticket qui n'as pas expiré. Il suffit d'en regénérer un autre avec Get Ticket RSA au cas ou.</li>\n<li>Il manque des exemples de réponses selons différents scénarios :</li>\n<li>Les informations données identifient un compte LVS : Connexion réussit ?</li>\n<li>Les informations données n'identifient pas un compte existant : Connexion manuelle ?</li>\n<li>Il manque des informations (date de naissance, etc) : Erreur ? Connexion manuelle ?</li>\n<li>Chaine chiffrée mal formée : Erreur 500.</li>\n<li>URI mal formée : Erreur ?</li>\n</ul>\n","urlObject":{"protocol":"https","path":["vsn.main",""],"host":["{{url_etablissement}}"],"query":[{"description":{"content":"<p>Chaîne de caractères obtenue après cryptage RSA d'une chaine spécifique.</p>\n","type":"text/plain"},"key":"extautolog","value":"{{chaine_cryptee}}"}],"variable":[]}},"response":[{"id":"f1513f1d-92db-47ee-9bbf-5a22bba322d3","name":"Connection avec une chaine mal formée, entrainant un échec du serveur","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://{{url_etablissement}}/vsn.main/?extautolog={{chaine_cryptee}}","protocol":"https","host":["{{url_etablissement}}"],"path":["vsn.main",""],"query":[{"key":"extautolog","value":"{{chaine_cryptee}}"}]}},"status":"Internal Server Error","code":500,"_postman_previewlanguage":"json","header":[{"key":"Server","value":"nginx"},{"key":"Date","value":"Fri, 24 Jan 2020 16:12:27 GMT"},{"key":"Content-Type","value":"application/json;charset=UTF-8"},{"key":"Transfer-Encoding","value":"chunked"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=20"}],"cookie":[],"responseTime":null,"body":"{\n    \"title\": \"Cannot invoke method trim() on null object\",\n    \"body\": \" at com.omt.securite.AuthCredentials.setProfil(AuthCredentials.groovy:64)\",\n    \"stack\": [\n        \" at com.omt.securite.AuthCredentials.setProfil(AuthCredentials.groovy:64)\",\n        \" at com.omt.vsn.socle.AbstractAuthController.checkAutologInfos(AbstractAuthController.groovy:363)\",\n        \" at com.omt.ws.vsn.WSAuthController.traiterAutologin(WSAuthController.groovy:502)\",\n        \" at com.omt.ws.vsn.WSAuthController.extAutolog(WSAuthController.groovy:477)\",\n        \" at net.bull.javamelody.JspWrapper.invoke(JspWrapper.java:152)\",\n        \" at net.bull.javamelody.JdbcWrapper$DelegatingInvocationHandler.invoke(JdbcWrapper.java:294)\",\n        \" at org.grails.plugins.web.rest.api.ControllersRestApi.forward(ControllersRestApi.groovy:53)\",\n        \" at com.omt.vsn.socle.MainController.index(MainController.groovy:40)\",\n        \" at net.bull.javamelody.JspWrapper.invoke(JspWrapper.java:152)\",\n        \" at net.bull.javamelody.JdbcWrapper$DelegatingInvocationHandler.invoke(JdbcWrapper.java:294)\",\n        \" at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:232)\"\n    ],\n    \"omtstack\": [\n        {\n            \"class\": \"java.lang.StackTraceElement\",\n            \"className\": \"com.omt.securite.AuthCredentials\",\n            \"fileName\": \"AuthCredentials.groovy\",\n            \"lineNumber\": 64,\n            \"methodName\": \"setProfil\",\n            \"nativeMethod\": false\n        },\n        {\n            \"class\": \"java.lang.StackTraceElement\",\n            \"className\": \"com.omt.vsn.socle.AbstractAuthController\",\n            \"fileName\": \"AbstractAuthController.groovy\",\n            \"lineNumber\": 363,\n            \"methodName\": \"checkAutologInfos\",\n            \"nativeMethod\": false\n        },\n        {\n            \"class\": \"java.lang.StackTraceElement\",\n            \"className\": \"com.omt.ws.vsn.WSAuthController\",\n            \"fileName\": \"WSAuthController.groovy\",\n            \"lineNumber\": 502,\n            \"methodName\": \"traiterAutologin\",\n            \"nativeMethod\": false\n        },\n        {\n            \"class\": \"java.lang.StackTraceElement\",\n            \"className\": \"com.omt.ws.vsn.WSAuthController\",\n            \"fileName\": \"WSAuthController.groovy\",\n            \"lineNumber\": 477,\n            \"methodName\": \"extAutolog\",\n            \"nativeMethod\": false\n        },\n        {\n            \"class\": \"java.lang.StackTraceElement\",\n            \"className\": \"com.omt.vsn.socle.MainController\",\n            \"fileName\": \"MainController.groovy\",\n            \"lineNumber\": 40,\n            \"methodName\": \"index\",\n            \"nativeMethod\": false\n        }\n    ]\n}"}],"_postman_id":"ad0ad70d-a4bb-46a2-a3ca-5a900ca37fc0"}],"id":"042c4317-cefa-42d1-adb6-4900b1d854a8","description":"<p>Il faut exécuter une série d'étapes avec le sous-domaine de LaVieScolaire. Le module Fake-SSO de notre ENT s’occupe de cette procédure.</p>\n<ol>\n<li>Interroger <code>https://{{url_etablissement}}/vsn.main/autoLoginTocketSession/getTicket/</code> où</li>\n</ol>\n<ul>\n<li><code>{{url_etablissement}}</code> est l’adresse de base de l'établissement de LaVieScolaire auquel l’utilisateur souhaite se connecter. Exemples : <code>etab3.la-vie-scolaire.fr</code>, <code>etablissementsso.la-vie-scolaire.fr</code></li>\n<li>Voir <a href=\"#093fb0a5-ffbb-4547-87b2-c7ebc4ea3c40\">GET Ticket RSA</a></li>\n</ul>\n<ol>\n<li>Le serveur retourne un ticket. Exemple :  <code>87e06d813451d6a1c33b0aaa6f8794e8</code></li>\n<li>Interroger <code>https://{{url_etablissement}}/vsn.main/?extautolog={{chaine chiffrée}}</code> où</li>\n</ol>\n<ul>\n<li><code>{{chaine chiffrée}}</code> est une chaine composée de plusieurs paramètres.</li>\n<li>Voir <a href=\"#ad0ad70d-a4bb-46a2-a3ca-5a900ca37fc0\">GET Connexion d'un utilisateur</a></li>\n</ul>\n<ol>\n<li>Selon la conformité des informations plusieurs réponses sont possibles :</li>\n</ol>\n<ul>\n<li>Si les informations identifiants l’utilisateur ne sont pas fournit, l’utilisateur devra s'authentifier.</li>\n<li>Si les informations identifiants l’utilisateur sont fournit mais que LaVieScolaire détermine plusieurs comptes, l’utilisateur devra s'authentifier, puis le serveur externe mémorise et associe l'<code>{Id de l’utilisateur}</code> pour ne plus le ré-authentifier.</li>\n<li>Si les informations identifiants l’utilisateur sont fournit et que LaVieScolaire identifie son compte, l’utilisateur sera connecté dans son compte.</li>\n</ul>\n","event":[{"listen":"prerequest","script":{"id":"14e80678-2595-413c-becb-f331e4416bd1","type":"text/javascript","exec":[""]}},{"listen":"test","script":{"id":"c5f0a2e7-7369-45c7-904e-5c496d4a2e31","type":"text/javascript","exec":[""]}}],"_postman_id":"042c4317-cefa-42d1-adb6-4900b1d854a8"},{"name":"Méthode SSO CAS","item":[{"name":"Ticket PT","id":"550e85b3-df4f-45e2-9e6e-d718e3d6aeef","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://{{url_etablissement}}/vsn.main/?ident={{appli}}","description":"<blockquote>\n<p>Pas implémenté ici.</p>\n</blockquote>\n<p>Génère un jeton d'authentification à retourner au client, et utilisé entre le client et le serveur pour confirmer la connexion.</p>\n","urlObject":{"protocol":"https","path":["vsn.main",""],"host":["{{url_etablissement}}"],"query":[{"description":{"content":"<p>Code unique de 20 caractères déterminé par Axess Education et identifiant l'établissement de notre ENT.</p>\n","type":"text/plain"},"key":"ident","value":"{{appli}}"}],"variable":[]}},"response":[{"id":"d98a5584-4ada-4e50-8606-0d25c70fcf47","name":"Demander un ticket PT, mais être redirigé vers la page de connexion ","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://{{url_etablissement}}/vsn.main/?ident={{appli}}","protocol":"https","host":["{{url_etablissement}}"],"path":["vsn.main",""],"query":[{"key":"ident","value":"{{appli}}","description":"Code unique de 20 caractères déterminé par Axess Education et identifiant l'établissement de notre ENT."}]}},"status":"OK","code":200,"_postman_previewlanguage":"html","header":[{"key":"Server","value":"nginx"},{"key":"Date","value":"Fri, 24 Jan 2020 18:07:06 GMT"},{"key":"Content-Type","value":"text/html"},{"key":"Transfer-Encoding","value":"chunked"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=20"},{"key":"Vary","value":"Accept-Encoding"},{"key":"Vary","value":"Accept-Encoding"},{"key":"P3P","value":"policyref=\"/w3c/p3p.xml\", CP=\"NON CUR ADM OUR STP STA\""},{"key":"Strict-Transport-Security","value":"max-age=3456000"},{"key":"Content-Encoding","value":"gzip"}],"cookie":[],"responseTime":null,"body":"<!doctype html>\n<html>\n\t<head>\n\t\t<meta charset=\"utf-8\">\n\t\t<title>la-vie-scolaire</title>\n\t\t<base href=\"/\">\n\t\t<meta http-equiv=\"cache-control\" content=\"no-cache, must-revalidate, post-check=0, pre-check=0\">\n\t\t<meta http-equiv=\"expires\" content=\"0\">\n\t\t<meta http-equiv=\"pragma\" content=\"no-cache\">\n\t\t<!--<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">    OLD META -->\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no\">\n\t\t<!--web app -->\n\t\t<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n\t\t<!-- Chrome, Firefox OS and Opera -->\n\t\t<meta name=\"theme-color\" content=\"#2e7cff\">\n\t\t<!-- Windows Phone -->\n\t\t<meta name=\"msapplication-navbutton-color\" content=\"#2e7cff\">\n\t\t<!-- iOS Safari -->\n\t\t<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"default\">\n\t\t<!--favicon-->\n\t\t<link rel=\"apple-touch-icon\" sizes=\"57x57\" href=\"assets/images/favicons/apple-touch-icon-57x57.png\">\n\t\t<link rel=\"apple-touch-icon\" sizes=\"60x60\" href=\"assets/images/favicons/apple-touch-icon-60x60.png\">\n\t\t<link rel=\"apple-touch-icon\" sizes=\"72x72\" href=\"assets/images/favicons/apple-touch-icon-72x72.png\">\n\t\t<link rel=\"apple-touch-icon\" sizes=\"76x76\" href=\"assets/images/favicons/apple-touch-icon-76x76.png\">\n\t\t<link rel=\"apple-touch-icon\" sizes=\"114x114\" href=\"assets/images/favicons/apple-touch-icon-114x114.png\">\n\t\t<link rel=\"apple-touch-icon\" sizes=\"120x120\" href=\"assets/images/favicons/apple-touch-icon-120x120.png\">\n\t\t<link rel=\"apple-touch-icon\" sizes=\"144x144\" href=\"assets/images/favicons/apple-touch-icon-144x144.png\">\n\t\t<link rel=\"apple-touch-icon\" sizes=\"152x152\" href=\"assets/images/favicons/apple-touch-icon-152x152.png\">\n\t\t<link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"assets/images/favicons/apple-touch-icon-180x180.png\">\n\t\t<link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"assets/images/favicons/favicon-32x32.png\">\n\t\t<link rel=\"icon\" type=\"image/png\" sizes=\"194x194\" href=\"assets/images/favicons/favicon-194x194.png\">\n\t\t<link rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"assets/images/favicons/android-chrome-192x192.png\">\n\t\t<link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"assets/images/favicons/favicon-16x16.png\">\n\t\t<link rel=\"manifest\" href=\"assets/images/favicons/manifest.json\">\n\t\t<link rel=\"mask-icon\" href=\"assets/images/favicons/safari-pinned-tab.svg\" color=\"#e61782\">\n\t\t<meta name=\"msapplication-TileColor\" content=\"#e61782\">\n\t\t<meta name=\"msapplication-TileImage\" content=\"assets/images/favicons/mstile-144x144.png\">\n\t\t<!--<link href=\"https://cdn.syncfusion.com/ej2/material.css\" rel=\"stylesheet\" />-->\n\t\t<!--typo-->\n\t\t<link href=\"https://fonts.googleapis.com/css?family=Quicksand:300,400,500,700\" rel=\"stylesheet\">\n\t\t<script src=\"assets/js/include/ckeditor/ckeditor.js\"></script>\n\t\t<link rel=\"stylesheet\" href=\"styles.2623304280e1d01807c7.css\">\n\t</head>\n\t<body>\n\t    <app-convergence>\n\t        <div class=\"loading_page\">\n\t            <div class=\"loader\"></div>\n\t      Chargement en cours...\n\t        </div>\n\t    </app-convergence>\n\t</body>\n</html>"}],"_postman_id":"550e85b3-df4f-45e2-9e6e-d718e3d6aeef"},{"name":"Connexion d'un utilisateur","id":"8b0f5d4f-1745-4b51-a304-bbee3dcf929e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://{{url_etablissement}}/vsn.main/autoLoginTicketSession/getCasTicket/?casTicket={{ticket CAS}}&ident={{appli}}&hostCAS={{url serveur CAS}}&profil={{profil}}&nom={{nom}}&prenom={{prenom}}&dtn={{dtn}}","description":"<p>Connecte un utilisateur donné à l'établissement LaVieScolaire donné à l'aide de l'autorité CAS donnée et du jeton d'authentification.</p>\n<blockquote>\n<p>Pas implémenté ici.</p>\n</blockquote>\n","urlObject":{"protocol":"https","path":["vsn.main","autoLoginTicketSession","getCasTicket",""],"host":["{{url_etablissement}}"],"query":[{"description":{"content":"<p>Jeton d'authentification reçu par le client et émis par l'autorité CAS du client.</p>\n","type":"text/plain"},"key":"casTicket","value":"{{ticket CAS}}"},{"description":{"content":"<p>Code unique de 20 caractères déterminé par Axess Education et identifiant l'établissement de notre ENT</p>\n","type":"text/plain"},"key":"ident","value":"{{appli}}"},{"description":{"content":"<p>URL d'accès au serveur CAS de l'application appelante (peux également comprendre le port).\nCette URL permettra de valider le ticket PT que\nl'application appelante a fourni en paramètre.</p>\n","type":"text/plain"},"key":"hostCAS","value":"{{url serveur CAS}}"},{"description":{"content":"<p>Le profil de l'utilisateur parmis <code>eleve</code>, <code>responsable</code>, <code>professeur</code>.</p>\n","type":"text/plain"},"key":"profil","value":"{{profil}}"},{"description":{"content":"<p>Le nom de l'utilisateur</p>\n","type":"text/plain"},"key":"nom","value":"{{nom}}"},{"description":{"content":"<p>Le prénom de l'utilisateur</p>\n","type":"text/plain"},"key":"prenom","value":"{{prenom}}"},{"description":{"content":"<p>La date de naissance de l'utilisateur</p>\n","type":"text/plain"},"key":"dtn","value":"{{dtn}}"}],"variable":[]}},"response":[{"id":"a7b24362-317e-4b1b-a85d-fcb5a62683d0","name":"Connecter un professeur sans fournir de ticket ni d'autorité, retourne sur une page de connexion.","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://{{url_etablissement}}/vsn.main/autoLoginTicketSession/getCasTicket/?casTicket={{ticket_CAS}}&ident={{appli}}&hostCAS={{url_serveur_CAS}}&profil=professeur&nom=Professeur&prenom=sso&dtn=13/07/2012","protocol":"https","host":["{{url_etablissement}}"],"path":["vsn.main","autoLoginTicketSession","getCasTicket",""],"query":[{"key":"casTicket","value":"{{ticket_CAS}}"},{"key":"ident","value":"{{appli}}"},{"key":"hostCAS","value":"{{url_serveur_CAS}}"},{"key":"profil","value":"professeur"},{"key":"nom","value":"Professeur"},{"key":"prenom","value":"sso"},{"key":"dtn","value":"13/07/2012"}]}},"status":"OK","code":200,"_postman_previewlanguage":"html","header":[{"key":"Server","value":"nginx"},{"key":"Date","value":"Thu, 23 Jan 2020 17:59:53 GMT"},{"key":"Content-Type","value":"text/html"},{"key":"Transfer-Encoding","value":"chunked"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=20"},{"key":"Vary","value":"Accept-Encoding"},{"key":"Vary","value":"Accept-Encoding"},{"key":"P3P","value":"policyref=\"/w3c/p3p.xml\", CP=\"NON CUR ADM OUR STP STA\""},{"key":"Strict-Transport-Security","value":"max-age=3456000"},{"key":"Content-Encoding","value":"gzip"}],"cookie":[],"responseTime":null,"body":"<!doctype html>\n<html>\n\t<head>\n\t\t<meta charset=\"utf-8\">\n\t\t<title>la-vie-scolaire</title>\n\t\t<base href=\"/\">\n\t\t<meta http-equiv=\"cache-control\" content=\"no-cache, must-revalidate, post-check=0, pre-check=0\">\n\t\t<meta http-equiv=\"expires\" content=\"0\">\n\t\t<meta http-equiv=\"pragma\" content=\"no-cache\">\n\t\t<!--<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">    OLD META -->\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no\">\n\t\t<!--web app -->\n\t\t<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n\t\t<!-- Chrome, Firefox OS and Opera -->\n\t\t<meta name=\"theme-color\" content=\"#2e7cff\">\n\t\t<!-- Windows Phone -->\n\t\t<meta name=\"msapplication-navbutton-color\" content=\"#2e7cff\">\n\t\t<!-- iOS Safari -->\n\t\t<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"default\">\n\t\t<!--favicon-->\n\t\t<link rel=\"apple-touch-icon\" sizes=\"57x57\" href=\"assets/images/favicons/apple-touch-icon-57x57.png\">\n\t\t<link rel=\"apple-touch-icon\" sizes=\"60x60\" href=\"assets/images/favicons/apple-touch-icon-60x60.png\">\n\t\t<link rel=\"apple-touch-icon\" sizes=\"72x72\" href=\"assets/images/favicons/apple-touch-icon-72x72.png\">\n\t\t<link rel=\"apple-touch-icon\" sizes=\"76x76\" href=\"assets/images/favicons/apple-touch-icon-76x76.png\">\n\t\t<link rel=\"apple-touch-icon\" sizes=\"114x114\" href=\"assets/images/favicons/apple-touch-icon-114x114.png\">\n\t\t<link rel=\"apple-touch-icon\" sizes=\"120x120\" href=\"assets/images/favicons/apple-touch-icon-120x120.png\">\n\t\t<link rel=\"apple-touch-icon\" sizes=\"144x144\" href=\"assets/images/favicons/apple-touch-icon-144x144.png\">\n\t\t<link rel=\"apple-touch-icon\" sizes=\"152x152\" href=\"assets/images/favicons/apple-touch-icon-152x152.png\">\n\t\t<link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"assets/images/favicons/apple-touch-icon-180x180.png\">\n\t\t<link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"assets/images/favicons/favicon-32x32.png\">\n\t\t<link rel=\"icon\" type=\"image/png\" sizes=\"194x194\" href=\"assets/images/favicons/favicon-194x194.png\">\n\t\t<link rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"assets/images/favicons/android-chrome-192x192.png\">\n\t\t<link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"assets/images/favicons/favicon-16x16.png\">\n\t\t<link rel=\"manifest\" href=\"assets/images/favicons/manifest.json\">\n\t\t<link rel=\"mask-icon\" href=\"assets/images/favicons/safari-pinned-tab.svg\" color=\"#e61782\">\n\t\t<meta name=\"msapplication-TileColor\" content=\"#e61782\">\n\t\t<meta name=\"msapplication-TileImage\" content=\"assets/images/favicons/mstile-144x144.png\">\n\t\t<!--<link href=\"https://cdn.syncfusion.com/ej2/material.css\" rel=\"stylesheet\" />-->\n\t\t<!--typo-->\n\t\t<link href=\"https://fonts.googleapis.com/css?family=Quicksand:300,400,500,700\" rel=\"stylesheet\">\n\t\t<script src=\"assets/js/include/ckeditor/ckeditor.js\"></script>\n\t\t<link rel=\"stylesheet\" href=\"styles.2623304280e1d01807c7.css\">\n\t</head>\n\t<body>\n\t    <app-convergence>\n\t        <div class=\"loading_page\">\n\t            <div class=\"loader\"></div>\n\t      Chargement en cours...\n\t        </div>\n\t    </app-convergence>\n\t</body>\n</html>"}],"_postman_id":"8b0f5d4f-1745-4b51-a304-bbee3dcf929e"}],"id":"c5506556-8de1-47ec-805f-a76ca1a3cd1b","description":"<blockquote>\n<p>Remarque : Nous n'utilisons pas cette méthode, aussi elle n'est pas complètement documentée, et les API présentées ici ne sont pas opérationnelles.</p>\n</blockquote>\n<p>Le client et le serveurs utilise une autorité pour identifier un utilisateur des deux plateformes et permettre la connexion. \nLorsque le client contacte le serveur, il lui fournit l'URL vers l'autorité et des informations de l'utilisateur. Plus précisément : </p>\n<ol>\n<li>Le Client génère un <strong>ticket PT</strong> auprès de son autorité CAS </li>\n<li>Le Client envoie les informations de l'utilisateur, le ticket et l'adresse de l'autorité au serveur</li>\n<li>Le serveur questionne l'autorité avec la commande <code>serviceValidate()</code> qui réponds avec un XML comprenant les informations de l'utilisateur (dont l'uuid <code>cas:user</code>) et retrouve le compte correspondant dans son environnement.\n a. Si le compte est trouvé, le client récupère une URL prédéfinie pour rediriger l'utilisateur\n b. Si le compte n'est pas trouvé : ?\n c. Si une erreur interne survient : ?\n d. Si les informations données sont incomplètes ou mal formées : ?</li>\n</ol>\n<h2 id=\"définitions\">Définitions</h2>\n<dl>\n    <dt>Solution appelante, Application appelante, Client</dt>\n    <dd>Notre ENT</dd>\n    <dt>Url etablissement, environnement La-Vie-Scolaire.fr</dt>\n    <dd>L'établissement, désigné par un sous-domaine de la-vie-scolaire.fr, auquel connecter l'utilisateur.</dd>\n    <dt>CAS, Serveur CAS, Autorité de confiance</dt>\n    <dd>Autorité assurance l'authentification de l'utilisateur entre le client et le serveur. Voir <a href=\"https://en.wikipedia.org/wiki/Central_Authentication_Service\">Central Authentication Service, Wikipedia (EN)</a></dd>\n    <dt>Ticket CAS, Ticket PT</dt>\n    <dd>Jeton authentification généré par l'autorité et échangée entre le client et le serveur</dd>\n</dl>","event":[{"listen":"prerequest","script":{"id":"b4dfb436-0632-4b19-93eb-4557b5413a57","type":"text/javascript","exec":[""]}},{"listen":"test","script":{"id":"62319eca-03ce-4939-af00-cfcea72e9ad3","type":"text/javascript","exec":[""]}}],"_postman_id":"c5506556-8de1-47ec-805f-a76ca1a3cd1b"}],"event":[{"listen":"prerequest","script":{"id":"d4e32bba-1075-4b87-8bfc-b81b116cf5c2","type":"text/javascript","exec":[""]}},{"listen":"test","script":{"id":"3e9a7175-03fd-410a-809e-8794560a4c63","type":"text/javascript","exec":[""]}}]}