[Résolu] Alamofire - SSL error occured et authentification par token (jeton)

Bonjour,
j’utilise un logiciel client accessible via safari pour la gestion de mes cours dans une école de musique.
Malheureusement, leur site internet n’est pas compatible avec les écrans tactiles.
Je souhaiterais donc créer une application ios pour me connecter au site avec mes identifiants et ensuite récupérer les données fournies par le site pour pouvoir les manipuler depuis ma tablette.

J’ai donc fait un tout premier test avec Alamofire mais j’obtiens une erreur pour charger le contenu du site distant.

voici l’erreur :

An ssl error has occurred and a secure connection to the server cannot be made.

Voici le code source utilisé :
import UIKit
import Alamofire

class ViewController: UIViewController {
@IBOutlet weak var ui_sourceTextView: UITextView!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    Alamofire.request("https://www.monsite.fr/extranet/login/ens_index_enseignant.php").responseString { (response) in
        switch response.result {
        case .success:
        if let htmlBody = response.result.value {
            self.ui_sourceTextView.text = htmlBody
        }
        case .failure(let error):
            self.ui_sourceTextView.text = error.localizedDescription
        }
            self.ui_sourceTextView.sizeToFit()
        }
    }

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

}

Est-ce que le problème provient du certificat SSL du site?
Y-a-t-il un moyen de contourner le problème pour charger les données ?

Merci pour votre attention.

universalix

Je ne suis pas sur mais j’ai fait un test avec pod ‹ Alamofire ›, '~> 4.6’

Voilà le retour que j’ai :

[code]

<!-- JAVASCRIPT -->
<script type="text/javascript" src="../includes_extranet/javascript.php?files=../includes/functions.js,../includes_extranet/functions_web.js,../login/gen_index_generique.js,../includes/md5.js,../includes/functions_data.js" ></script>


<!-- Style CSS -->

<style type="text/css" title="currentStyle" media="all">
	  @import "../../DATA/extranet/CSS/defaut.css";
	  @import "../style/jquery.css";
</style>


<title>Extranet iMuse : Accès enseignant</title>
<!-- Contenu principal -->
 <div id="CONTENU">        
	
	
	<fieldset id="INDEX_FLD_IDENTIFICATION" class="fld_identification">
	<legend>Accès Enseignant</legend>
	
	<div id="CONTENU_FIELDSET">
	<div class="LogoCenter">
		
		<img src="../img_extranet/logo_login.png?v=1840" id="INDEX_LOGO_IMUSE" alt="Logo d'iMuse" style="width:150px;height:140px;" /><br/>
		
	</div>
    
	<br/>
	<table id="INDEX_TBL_LOGIN">	
		<tr class="">
			<td class="alignRight"><label id="INDEX_LABEL_SITE_NUMERO" for="INDEX_SITE_NUMERO">Site</label></td>
			<td>
				<select  name="site_numero" id="INDEX_SITE_NUMERO" class="login_site_numero" >
				<option value="3">Conservatoires</option><option value="4">Fleury les Aubrais</option><option value="6">Ingre</option><option value="8">Olivet</option><option value="11">Orleans</option><option value="5">Ormes</option>
				</select>
			</td>
		</tr>
		
		<tr>
			<td class="alignRight"><label id="INDEX_LABEL_USER" for="INDEX_USER_ID">Identifiant</label></td>
			<td><input  type="text" name="user_id" id="INDEX_USER_ID" class="login_user_id" value="" maxlength="20" /></td>
		</tr>
		
		<tr>
			<td class="alignRight"><label id="INDEX_LABEL_PWD" for="INDEX_USER_PWD">Mot de passe</label></td>
			<td><input  type="password" name="user_pwd" id="INDEX_USER_PWD" class="login_user_pwd" /></td>
		</tr> 
	 </table>
	<br/>
	<div class="alignCenter">
	<label ></label>
	</div>
	<div class="alignCenter">
		<input  type="button" name="bt_login" id="INDEX_BT_LOGIN" value="Se connecter" alt="Se connecter à l'extranet" onfocus="disable_onkeypress(true);" onblur="disable_onkeypress(false);" onclick="login_extranet('enseignant') ;"/>
		<br/><br/>
		<a class="" href="#" id="INDEX_MDP_PERDU" onclick="open_popup_getpass();" alt="Accéder à la fenêtre de demande de mot de passe." onfocus="disable_onkeypress(true);" onblur="disable_onkeypress(false);">Mot de passe perdu</a>
	</div>
	<br/>
		<a href="../accessibilite/gen_accessibilite.php" id="INDEX_ACCESSIBILITE" alt="Accéder à l'accessibilité" class="" onfocus="disable_onkeypress(true);" onblur="disable_onkeypress(false);">Accessiblité</a>
	</div> 
	</fieldset>
	<div class="alignCenter">
	<p class="fontsize11">NAV_NON_SUPPORTE_autre</p>
	</div>
	<script>
		//on centre le contenu du fieldset verticalement  code directement dans la page � cause d'IE (�l�ment non centr� une fois sur 2)
	if(document.getElementById('INTERFACE_NAVIGATEUR').value=="IE" || document.getElementById('INTERFACE_NAVIGATEUR').value=="BAD_VERSION_NAV_IE")
	{
		centrerBlocVertical('CONTENU_FIELDSET','INDEX_FLD_IDENTIFICATION');
	}
	</script>       
  </div>
  
  <!--  Footer -->
  <div id="PIED_EXTRANET">
  	<span id="PIED_EXTRANET_GAUCHE">© Saiga Informatique</span>
  	<span id="PIED_EXTRANET_CENTRE">v1.8.5.1</span>
  	<span id="PIED_EXTRANET_DROIT">Extranet iMuse®</span>
  </div>
[/code]

j’ai aussi ce warning :

[BoringSSL] Function boringssl_session_errorlog: line 2881 [boringssl_session_read] SSL_ERROR_ZERO_RETURN(6): operation failed because the connection was cleanly shut down with a close_notify alert

warning qui d’après ce que j’ai compris n’est pas quelque chose que l’on peu corrigé.

avec:

static func getHtmlTest() {
Alamofire.request("https://www.imuse-orleansmetropole.fr/extranet/login/ens_index_enseignant.php").responseString { (response) in
            switch response.result {
            case .success:
                if let htmlBody = response.result.value {
                    print(htmlBody)
                }
            case .failure(let error):
                print(error.localizedDescription)
            }
        }
    }

dans info.plist il faut quelque chose du genre je crois :

j’espere que ça pourra t’aider.

Damien

Merci,
je parviens maintenant à charger ma page, je vais pouvoir essayer de me logger via Alamofire.
bonne journée.

universalix

Bonjour.
Je ne parviens pas à me logger avec mes paramètres sur le site.
Si j’ai bien observé le code javascript, je dois faire un POST sur l’adresse https://www.monsite.fr/extranet/login/gen_identification.php avec mes paramètres (site, login, mdp, groupe). Si le serveur renvoie une réponse positive à ma requête, je dois être redirigé vers cette nouvelle adresse : https://www.monsite.fr/extranet/enseignant/ens_enseignant.php.
C’est sur cette nouvelle page que je souhaites ensuite pouvoir récupérer le contenu à traiter dans mon app ios.
Actuellement, avec mon code, je reviens inlassablement vers l’url : https://www.monsite.fr/extranet/login/ens_index_enseignant.php mais j’aimerais déjà trouver un moyen de tester ma connexion au site avec mes paramètres.

Je suis en train d’essayer de comprendre le fonctionnement d’alamofire pour aller plus loin mais si vous avez déjà été confronté à ce scénario, cela me ferait gagner du temps.

En résumé il faut que :

  • j’arrive à ouvrir une session sur le site distant
  • puis rediriger ma requête vers la nouvelle url (en conservant la session ouverte).

Voici mon code actuel avec des log/pass génériques (donc ça ne pourra pas marcher si vous testez) :
let parameters: Parameters = [
“site”: “5”,
“login”: “monNom”,
“mdp”: “monMotDePasse”,
“groupe”: “enseignant”
]

    Alamofire.request("https://www.monsite.fr/extranet/login/gen_identification.php", method: .post, parameters: parameters).responseString { (response) in
        switch response.result {
        case .success:
            if let htmlBody = response.result.value {
                print(htmlBody)
                self.ui_sourceTextView.text = htmlBody
            }
        case .failure(let error):
            print(error.localizedDescription)
        }
    }

Voilà le code javascript du site qui contient la fonction de demande de connexion :
function login_extranet(groupe){

        if(document.getElementById('INDEX_SITE_NUMERO')!=null)
        var site = document.getElementById('INDEX_SITE_NUMERO').value;
        else
        var site = "-1";
        
        var login = document.getElementById('INDEX_USER_ID').value;
        var mdp = MD5(document.getElementById('INDEX_USER_PWD').value);
        
        var params = '&site='+site+'&login='+encode_bien(login)+'&mdp='+mdp+"&groupe="+groupe;
        var resp = sendreq("../login/gen_identification.php",params,"POST",false);
        var rep=extractFromXML("RETOUR",resp);
        if(rep!="OK"){
            var acces = document.getElementById('INTERFACE_MODE_ACCESSIBILITE').value;
            if(acces=="on")
            {
                var url = new String(window.document.location);
                url = url.replace("#","");
                url = Param(url,"err","5");
                url = Param(url,"msg",null);
                document.location = url;
            }
            else
            erreur(rep);
        }
        else
        {
            var prefixe="";
            switch(groupe){
            case "admin":
                prefixe="adm_";
                break;
            case "enseignant":
                prefixe="ens_";
                break;
            case "famille":
                prefixe="usa_";
                break;
            default:
                break;
            }
            document.location = '../'+groupe+'/'+prefixe+groupe+'.php';
        }
    }

Merci pour votre attention.

Je pense qu’il faudrait voir si le site ne revois pas un token de connexion qu’il faudrait passé au header

Il faudrait voir le retour exact de la requête

Bonsoir,
effectivement dans le fichier javascript du site il y a des références au token.
J’ai également dans les cookies de safari un cookie crée par le site avec notamment comme contenu une chaîne composée de 26 caractères.

Je mets en fichier joint le fichier javascript.javascript.php.zip (105,2 Ko)

Bonjour,
dans la fonction d’envoi du mot de passe sur le site internet, il y a une fonction de cryptage MD5 du mot de passe.
Actuellement ma fonction Alamofire envoie mon mot de passe en clair. Il faudrait que je passe mon mot de passe à la moulinette de la fonction md5 de leur site qui est celle-ci : https://gist.github.com/ianpurton/1122503

Je dois donc trouver un moyen d’appliquer leur fonction MD5 à mon mot de passe avant d’envoyer le paramètre via alamofire.

Ce qu’il faut faire c’est simuler l’appel à la fonction d’identification.

https://www.imuse-orleansmetropole.fr/extranet/login/gen_identification.php

les paramètres sont a envoyer en POST :

  • site=3
  • login=login
  • mdp=9ee5923fc73ded1b84ba78a17e1282bc (ça a l’air d’être en md5)
  • groupe=enseignant

c’est ce qu’il se passe quand on clique sur le bouton se connecter

normalement dans le retour tu dois avoir un token il faut que tu teste quand tu te connectes pour voir ce que ça te renvoi quand la connexion et bonne pour dire à Alamofire quoi récupérer.
par exemple voila ce que j’ai fait pour avoir les paramètres (en bas a droite):

Voilà, fais une connexion réussi et vois ton retour tu devrais avoir un token, ensuite il faudra que tu passes ton token dans ton Header à chaque requête je pense.

Bonjour,
je n’arrive pas à trouver le token qui permet de garder la session ouverte lors des requêtes.
Voici ce que j’obtiens lorsque je m’enregistre sur le site :

Citation
Requête POST
https://www.imuse-orleansmetropole.fr/extranet/login/gen_identification.php
Entêtes de requête :
Host: www.imuse-orleansmetropole.fr
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:61.0) Gecko/20100101 Firefox/61.0
Accept: /
Accept-Language: fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br
Referer: https://www.imuse-orleansmetropole.fr/extranet/login/ens_index_enseignant.php
Content-type: application/x-www-form-urlencoded
Content-Length: 79
Cookie: IMUSE_LAST_SITE_NUMERO=5; IMUSE_LAST_LOGIN=lastlogin; IMUSE_LAST_GROUP_ID=9; iMuse-extranet=amu1aajq7vc62gm4r6ssfuvhq2; cook_user_login_enseignant=monlogin; cook_user_site_enseignant=5
Connection: keep-alive
Corps de la requête (modifié pour garder la confidentialité de mon log/pass) :
&site=5&login=monlogin&mdp=monmotdepasseauformatMD5&groupe=enseignant

J’ai l’impression que la session est gérée par le serveur distant.
Il faut que la session soit ouverte avec mes paramètres et avec le code contenu dans mon cookie sous le champ : iMuse-extranet qui change selon le navigateur utilisé.
En effet, je peux très bien avoir une session ouverte sous Safari et Firefox. Lorsque je quitte ma session sous safari, elle reste ouverte sous firefox.

il faudrait donc peut-être que je puisse gérer une sorte de cookie avec Alamofire.
Je continue mes investigations;
Merci pour l’aide apportée.
__
universalix

regarde ce que tu as dans réponse au niveau de chaque requête

<ROOT><CODE>1</CODE><RETOUR>ERR5</RETOUR></ROOT>

je pense que tu dois avoir le token la dedant

Voici deux captures d’écran.
L’une correspond à la page gen_identification.php
L’autre à la page chargée après que l’authentification est réussie : ens_enseignant.php.


Du coup il faut voir les cookies est l’entete des requete avant et apres connexion pour voir ce qui change et ce que ça peux être :

voila un exemple avec du json de ce que je ferais une fois la connexion établie :


        let headers: HTTPHeaders = [
            "Content-Type" : "application/json",
            "Accept" : "application/json",
            "authorization" : token.tokenType! + " " + token.accessToken!,
            "x-csrf-token" : token.state!
        ]
        
        let parameters: Parameters = [
            "enseignant" : "Ense"
        ]
        
        let encoding = JSONEncoding.default
        
        Alamofire.request(
            url,
            method: .post,
            parameters: parameters,
            encoding: encoding,
            headers:headers)
            .validate()
            .responseJSON {
                response in
                switch response.result {
                case .failure(let errorResponse):
                    // handle errors (including `validate` errors) here
                    print("Erreur Serveur : \(errorResponse.localizedDescription)")
                    

                case .success:
                    if let data = response.data {
                        NotificationCenter.default.post(name: Notification.Name(rawValue: okNotificationID), object: self)
                        //print(data)
                    } else {
                        //print("Erreur ecriture")
                        NotificationCenter.default.post(name: Notification.Name(rawValue: errorNotificationID), object: self)
                    }
                }
        }
    }
    

Bien sur il faut l’adapter en mode texte et pas en JSON

pour le header de la connexion je pense qu’il faut mettre cette ligne :

Cookie: iMuse-extranet=n908tm7240votf2d2f9auagrd0; cook_user_site_enseignant=3; cook_user_login_enseignant=test; cook_accessibilite_mode=0

ce qui sous entant qu’il faut que tu récupères un cookies de connexion.

Je pense que le token c’est ça iMuse-extranet=n908tm7240votf2d2f9auagrd0

Après c’est compliqué de faire des tests sans avoir de compte.

Vois si quand tu te connectes la valeur de ton cookies change :

Cookie: iMuse-extranet=k1ivpa0rvd475fgdoun5uv79a3

Lorsque je me connecte, la valeur de mon cookie reste la même.
Dès lors que je me suis connecté, je peux très bien fermer la fenêtre imuse et charger dans de nouvelles fenêtre les pages qui nécessites d’être loggé.

En revanche, ma session expire toute seule au bout d’un certain temps.

Donc je pense qu’il faut envoyer les paramètres de connexion avec le code inséré dans le cookie dans le champ iMuse-extranet qui est crée au moment de la demande de connexion.
Après, c’est le serveur distant qui gère l’expiration automatique de la session.
N.B. mon code iMuse-extranet est différent dans safari et dans Firefox.

Il me faut donc :

  • trouver le moyen de traiter la création du cookie dans mon app ios
  • trouver comment renvoyer la chaîne de caractère iMuse-extranet dans ma requête POST.

J’ai trouvé le paramètre à renvoyer dans le header :

    let headers: HTTPHeaders = [
        "Cookie" : "cook_user_login_enseignant=monlogin; cook_user_site_enseignant=5; iMuse-extranet=macléstockéedanslecookie",
    ]

Pour faire au plus simple, je me suis loggé via safari puis j’ai lancé ma requête alamofire vers une page accessible uniquement après avoir été loggé avec les paramètres du header.
La page s’est parfaitement chargée dans mon simulateur ios.
Evidement, lorsque je ferme ma session via safari, la page n’est plus accessible.

Je dois maintenant trouver comment générer un cookie depuis mon application pour obtenir une clé pour la valeur iMuse-extranet.

teste ceci pour ton cookie

let parameters: [String: Any] = [:]
        let encoding = URLEncoding.default
        Alamofire.request(
            "https://www.imuse-orleansmetropole.fr/extranet/login/ens_index_enseignant.php",
            method: .post,
            parameters: parameters,
            encoding: encoding).response { response in
            if let headerFields = response.response?.allHeaderFields as? [String: String], let URL = response.request?.url
            {
                let cookies = HTTPCookie.cookies(withResponseHeaderFields: headerFields, for: URL)
                print(cookies)
                print(cookies[0].name)
                print(cookies[0].value)
                print(cookies[0].version)
                print(cookies[0].expiresDate)
                print(cookies[0].isHTTPOnly)
                print(cookies[0].isSessionOnly)
                print(cookies[0].isSecure)
                print(cookies[0].comment)
                print(cookies[0].commentURL)
            }
        }

alors de ce que je comprend il faut que tu fasse une première requête sur ton la page ens_index_enseignant.php il te génère un cookies voila le retour du dessus sur le téléphone :

[<NSHTTPCookie
	version:0
	name:iMuse-extranet
	value:6b2naq5q6tll9que58ipiiekn2
	expiresDate:'(null)'
	created:'2018-08-23 08:17:49 +0000'
	sessionOnly:TRUE
	domain:www.imuse-orleansmetropole.fr
	partition:none
	path:/
	isSecure:FALSE
 path:"/" isSecure:FALSE>]
iMuse-extranet
6b2naq5q6tll9que58ipiiekn2
0
nil
false
true
false
nil
nil

ensuite il te faudra stoker les infos de ton cookie sur ton applis il te faudra faire ta requête de connexion avec le bon header et les bons paramètres

```
let headers: HTTPHeaders = [
            "Content-Type" : "la_bonne_valeur",
            "Accept" : "la_bonne_valeur",
           //teste des choses mais le plus important pour moi c'est que dans chaque requete que tu feras tu passe cette ligne avec les bonne valeur:
           "Cookie": "cook_user_site_enseignant=3; iMuse-extranet=362ft4g6eg0lilhf9fs8gdtk30"


        ]
        
        let parameters: Parameters = [
            "groupe" : "enseignant",
            "login" : "ton_login",
            "mdp" : "ton_mot_de_passe_en_md5", 
            "site" : "3"
        ]
        
        let encoding =  // le bon encodage pour toi
        
        Alamofire.request(
            url,
            method: .post,
            parameters: parameters,
            encoding: encoding,
            headers:headers)
            .validate()
            .response {
   //ton traitement

}

Teste et dis moi

Hello, merci pour ton aide.
j’ai réussi à charger une page avec mon log/pass et le token généré par le site.

Il y a donc 3 étapes :

  • envoyer une requête sur la page /login/ens_index_enseignant.php et récupérer la valeur du token correspondant à iMuse-extranet

  • je m’authentifie via une requête POST sur la page /login/gen_identification.php pour activer ma session

  • je lance ma requête vers la page de mon choix avec le header complet pour pouvoir la charger.

    let headers: HTTPHeaders = [
    “Cookie” : “cook_user_login_enseignant=/(login); cook_user_site_enseignant=(site); (tokenName)=(imuseExtranet)”,
    ]

1 « J'aime »

@universalix génial.

Du coup tu peux même stocker le header directement une fois connecté et tu le passes à chaque changement de page.

D’ailleurs je pense que cette méthode fonctionnera pour les connexions élèves, tu dois avoir aussi un truc du style : “groupe” : “eleve” comme tu as “groupe” : “enseignant”

Courage pour la suite :smile:

Bonsoir,
après de bons moments de casse tête, voici le code que j’ai établi pour réaliser ma connexion.
Je suis débutant et donc je comprends petit à petit le fonctionnement des concepts de programmation.
J’ai donc persévéré pour essayer de sortir quelque chose de fonctionnel, d’un peu structuré et pas trop brouillon avec le peu de connaissances que j’ai actuellement sur le sujet.

J’ai crée une classe pour gérer tous le processus de récupération et de génération des paramètres et cookies pour activer une session sur le serveur distant et pouvoir ensuite charger les pages accessibles une fois loggé.

Malheureusement, je suis confronté à un dernier problème : le traitement asynchrone des données par Alamofire. Ainsi la totalité de mon code s’execute avant que j’ai pu récupérer mon token iMuse-extranet et généré le header http.

Voici le code issu de mon fichier Authentication.swift :

import Alamofire
import CryptoSwift

class ImuseAuthentication {
let _urlBeforeIdentification = “https://www.imuse-orleansmetropole.fr/extranet/login/ens_index_enseignant.php
let _urlIdentification = “https://www.imuse-orleansmetropole.fr/extranet/login/gen_identification.php
let _urlAccueil = “https://www.imuse-orleansmetropole.fr/extranet/enseignant/ens_enseignant.php
let _urlEleves = “https://www.imuse-orleansmetropole.fr/extranet/eleve/ens_eleve.php
let _urlCours = “https://www.imuse-orleansmetropole.fr/extranet/cours/ens_cours.php

let _site = 5
let _login = "monLogin"
let _originalPassword = "monMotDePasse" // devra être entré par l'utilisateur via l'UI
let _groupe = "enseignant"

var _passwordMd5:String?
var _tokenValue:String?
var _tokenName:String?
var _headers:HTTPHeaders?


init() {
}

func convertPasswordInMD5() {// conversion du mot de passe en clair au format MD5
    _passwordMd5 = _originalPassword.md5()
    print("Mot de passe MD5 : \(_passwordMd5)")
}


func tokenGrab() {// attention chargement asynchrone, il faut trouver un moyen pour que la fonction header ne se déclenche uniquement lorsque le token est récupéré
    Alamofire.request(_urlBeforeIdentification).responseString { (response) in
        switch response.result {
        case .success:

                if let headerFields = response.response?.allHeaderFields as? [String: String],
                    let URL = response.request?.url
                {
                    let cookies = HTTPCookie.cookies(withResponseHeaderFields: headerFields, for: URL)
                    self._tokenName = cookies[0].name
                    self._tokenValue = cookies[0].value
                    print(self._tokenValue)
                    print(self._tokenName)
                }
        case .failure(let error):
            print("Erreur")
        }
    }
}


func header() {
    let headers: HTTPHeaders = [
        "Cookie" : "cook_user_login_enseignant=\(self._login); cook_user_site_enseignant=\(self._site); iMuse-extranet=\(self._tokenValue)",
    ]
    _headers = headers
    print("En-têtes HTTP : \(_headers)")
}

func loginToActivateSession() {
    let parameters: Parameters = [
        "site" : "\(_site)",
        "login" : "\(_login)",
        "mdp" : "\(_passwordMd5!)",
        "groupe" : "\(_groupe)"
    ]
    
    Alamofire.request(_urlIdentification, method : .post, parameters : parameters).responseString { (response) in
        switch response.result {
        case .success:
            print(parameters)
        case .failure(let error):
            print(error.localizedDescription)
        }
    }
}

}

Voici le contenu de mon ViewController.swift :

import UIKit
import Alamofire

class ViewController: UIViewController {
@IBOutlet weak var ui_sourceTextView: UITextView!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    
    let _urlEleves = "https://www.imuse-orleansmetropole.fr/extranet/eleve/ens_eleve.php"

    let authentication = ImuseAuthentication()
    authentication.convertPasswordInMD5()
    authentication.tokenGrab()
    authentication.loginToActivateSession()
    authentication.header()
    
    print(authentication._headers)
    let headers: HTTPHeaders = authentication._headers!
    
    // crash en raison du traitement asynchrone d'Alamofire, le token iMuse-extranet=nil lorsque la requête suivant est executée.
    Alamofire.request(_urlEleves, headers : headers).responseString { (response) in
        switch response.result {
        case .success:
            if let htmlBody = response.result.value {
                self.ui_sourceTextView.text = htmlBody
                if let headerFields = response.response?.allHeaderFields as? [String: String],
                    let URL = response.request?.url
                {
                    let cookies = HTTPCookie.cookies(withResponseHeaderFields: headerFields, for: URL)
                    print(cookies[0].value)
                }
            }
        case .failure(let error):
            self.ui_sourceTextView.text = error.localizedDescription
        }
        self.ui_sourceTextView.sizeToFit()
    }

}



override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

}