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

Salut, bon déjà c’est super que tu sois arrivé si loin :+1:

Ensuite on est dimanche il est 6h30 du coup ne m’en tiens pas rigueur si tu ne comprends pas mes explications lol.

Ce message risque d’être un peu long car je vais te donner une façon de faire pour la gestion asynchrone de tes petits problèmes :smiley:. Sache qu’il y a beaucoup de façons de faire et que j’en prend une qui te permettra de comprendre d’autre concept plus tard. Il s’agit des Notifications.

Je m’explique une notification c’est simplement un message qu’envoi une classe A (ou autre chose) pour dire (le plus souvent) j’ai fini cette opération (ou autre).
Le truc c’est quelle le cris sur tous les “toits”.
Et de l’autre coté tu as d’autres classes qui écoutent pour voir quand la classe A a fini de faire la fameuse opération, du coup quand elles entendent “j’ai fini” elles peuvent lancer leurs opérations.

En gros une classe “dispache un event” et d’autres “l’écoutent”.

Maintenant je vais faire un pseudo code simple pour que tu puisses l’adapté.

Ma classe qui envoie le message :

import Foundation
import Alamofire

// les notifications sont messages qu'on envoie il doit être unique dans le monde d'apple du coup le mieux comme c'est des String c'est de les prefixer par le bundle de l'App
let errorServerNotificationID = "com.exemple.mon_app.errorServerNotificationID"
let errorResponseRequestANotificationID = "com.exemple.mon_app.errorResponseRequestANotificationID"
let okResponseRequestANotificationID = "com.exemple.mon_app.okResponseRequestANotificationID"

class A {

    func requestA() {
        Alamofire.request("ton URL et tout tes parametres").responseString { (response) in
            switch response.result {
                case .success:
                    //Attention un success ne veux pas dire qu'il s'agit bien de la réponse que tu attendais mais que le server a répondu. Il ne s'est pas planté donc dans un success il faut vérifier si la réponse est celle que tu attendais.

                    /*Attention dans ton cas les deux reponses :
                           * <ROOT><CODE>1</CODE><RETOUR>OK</RETOUR></ROOT>
                           *<ROOT><CODE>1</CODE><RETOUR>ERR5</RETOUR></ROOT>
                      sont dans le success*/

                        if "ma réponse est celle que j'attendais" {

                             //ici de fait des instructions peuvent s’exécuter

                             //j'envois ma notification de success
                            NotificationCenter.default.post(name: Notification.Name(rawValue: okResponseRequestANotificationID), object: self)
                        } else {

                             //ici de fait des instructions peuvent s’exécuter

                             //j'envois ma notification d'erreur
                             NotificationCenter.default.post(name: Notification.Name(rawValue: errorResponseRequestANotificationID), object: self)
                        }
                case .failure(let error):

                             //ici de fait des instructions peuvent s’exécuter

                             //j'envois ma notification d'erreur serveur
                             NotificationCenter.default.post(name: Notification.Name(rawValue: errorServerNotificationID), object: self)
                }
            }
        }
    
}

Petite truc : Comme tu peux le voir j’ai mis les notifications en variable globale à l’extérieur de la classe pour quelle soit accessible dans toute l’application mais tu pourrais les mettre dans une classe statique. Le but étant quelles soient accessible par toutes les classes qui vont écoutées et envoyées ses messages.

Maintenant la classe B qui va écouter le message (j’ai vue que tu voulais t’en servir dans ton viewcontroler donc je vais l’adapté au viewcontroler) :

import Foundation
import UIKit
import Alamofire

class ViewController: UIViewController {

    //MARK: - DESTRUCTOR 
    //attention toujours detruire les ecouteurs pour eviter les fuites mémoires quand tu crées un ecouteur tu le détruit dans le destructeur de la classe ou il a été créer. 
    deinit {
        NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: errorServerNotificationID), object: nil)
        NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: errorResponseRequestANotificationID), object: nil)
        NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: okResponseRequestANotificationID), object: nil)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        
        //Je vais creer 1 seul ecouteur par message à eccouter par classe ici car ma vue est chargé correctement du coup je sais qu'a se moment la si j'entend que la RequestA de la s'est exécuter je peux faire des choses
        // "#selector(didOkResponseRequestA)" veux dire que la methode qui va etre appel pour le message "rawValue: okResponseRequestANotificationID" est didOkResponseRequestA
        NotificationCenter.default.addObserver(self, selector: #selector(didOkResponseRequestA), name: Notification.Name(rawValue: okResponseRequestANotificationID), object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(didErrorServer), name: Notification.Name(rawValue: errorServerNotificationID), object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(didErrorResponseRequestA), name: Notification.Name(rawValue: errorResponseRequestANotificationID), object: nil)

    }

 @objc private func didOkResponseRequestA(){
        
        // je requestA est bien fini je fais ma requestB
        requestB() 
    }

 @objc private func didErrorServer(){
        //j'ai eu une erreur serveur j'affiche un message d'erreur
    }

 @objc private func didErrorResponseRequestA(){
        //j'ai eu une erreur par exemple car mes identifiant n'été pas bon j'affiche un message d'erreur
    }

    private func requestB() {
        Alamofire.request("ton URL et tout tes parametres").responseString { (response) in
            switch response.result {
                case .success:
                        if "ma réponse est celle que j'attendais" {
                            //ici de fait des instructions peuvent s’exécuter d'autres notifs si besoin
                        } else {
                             //ici de fait des instructions peuvent s’exécuter d'autres notifs si besoin
                        }
                case .failure(let error):
                             //ici de fait des instructions peuvent s’exécuter d'autres notifs si besoin
                }
            }
        }
    
}

Voilà ce long message et surtout j’espère avoir été assez clair. Surtout que j’ai eu un petit plantage d’internet entre temps et qu’il est 8h20 lol, je vais me faire une bonne tasse de café :sleeping:.

Pour info il ne s’agit que d’une seule solution il y a beaucoup d’autre façon de gérer asynchrone.

Merci pour la piste, je vais étudier ça de près.
Est-ce que les notifications peuvent fonctionner au sein d’une seule classe pour les fonctions?
C’est-à-dire qu’une fonction attend la réponse d’une autre fonction pour pouvoir s’executer.

@+

Oui ça marche de la même manière

J’aimerais faire en sorte que dans ma classe ImuseAuthentication, ma fonction tokenGrab() envoie un notification lorsqu’elle a récupéré la tokenValue pour iMuse-extranet pour lancer la fonction header() afin de pouvoir compléter l’entête complet pour les prochaines requêtes Alamofire.

J’ai du mal à adapter le code.
Je veux bien un peu d’aide.


import Alamofire
import Foundation
import CryptoSwift

// les notifications sont messages qu'on envoie il doit être unique dans le monde d'apple du coup le mieux comme c'est des String c'est de les prefixer par le bundle de l'App
let errorServerNotificationID = "com.exemple.mon_app.errorServerNotificationID"
//pour tokenGrab
let errorResponseTokenGrabNotificationID = "com.exemple.mon_app.errorResponseTokenGrabNotificationID"
let okResponseTokenGrabNotificationID = "com.exemple.mon_app.okResponseTokenGrabNotificationID"
//pour loginToActivateSession
let errorResponseLoginToActivateSessionNotificationID = "com.exemple.mon_app.errorResponseLoginToActivateSessionNotificationID"
let okResponseLoginToActivateSessionNotificationID = "com.exemple.mon_app.okResponseLoginToActivateSessionNotificationID"



class ImuseAuthentication {
    
    //MARK: - ATTRIBUTES
    
    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?
  
    //MARK: - CONSTRUCTOR
    
    init() {
        // j'initialise mes ecouteur dans le constructeur
        //Je vais creer 1 seul ecouteur par message à eccouter par classe ici car ma vue est chargé correctement du coup je sais qu'a se moment la si j'entend que la TokenGrab de la s'est exécuter je peux faire des choses
        // "#selector(didOkResponseTokenGrab)" veux dire que la methode qui va etre appel pour le message "rawValue: okResponseTokenGrabNotificationID" est didOkResponseTokenGrab
        NotificationCenter.default.addObserver(self, selector: #selector(didErrorServer), name: Notification.Name(rawValue: errorServerNotificationID), object: nil)
        //pour tokenGrab
        NotificationCenter.default.addObserver(self, selector: #selector(didOkResponseTokenGrab), name: Notification.Name(rawValue: errorResponseTokenGrabNotificationID), object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(didErrorResponseTokenGrab), name: Notification.Name(rawValue: errorResponseTokenGrabNotificationID), object: nil)
        //pour loginToActivateSession
        NotificationCenter.default.addObserver(self, selector: #selector(didOkResponseLoginToActivateSession), name: Notification.Name(rawValue: errorResponseloginToActivateSessionNotificationID), object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(didErrorResponseLoginToActivateSession), name: Notification.Name(rawValue: errorResponseloginToActivateSessionNotificationID), object: nil)
        
    }
    
    //MARK: - DESTRUCTOR
    
    //attention toujours detruire les ecouteurs pour eviter les fuites mémoires quand tu crées un ecouteur tu le détruit dans le destructeur de la classe ou il a été créer.
    deinit {
        NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: errorServerNotificationID), object: nil)
        //pour tokenGrab
        NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: errorResponseTokenGrabNotificationID), object: nil)
        NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: okResponseTokenGrabNotificationID), object: nil)
        //pour loginToActivateSession
        NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: errorResponseLoginToActivateSessionNotificationID), object: nil)
        NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: okResponseLoginToActivateSessionNotificationID), object: nil)
    }
    
    //MARK: - METHODS
    
    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)
                    NotificationCenter.default.post(name: Notification.Name(rawValue: okResponseTokenGrabNotificationID), object: self)
                } else {
                    NotificationCenter.default.post(name: Notification.Name(rawValue: errorResponseTokenGrabNotificationID), object: self)
                }
                
            case .failure(let error):
                print("Erreur")
                //j'envois ma notification d'erreur serveur
                NotificationCenter.default.post(name: Notification.Name(rawValue: errorServerNotificationID), object: self)
            }
        }
    }
    
    
    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:
                
                NotificationCenter.default.post(name: Notification.Name(rawValue: okResponseLoginToActivateSessionNotificationID), object: self)
                print(parameters)
                
            //TODO : verifier que la réponse attendu et bien celle la if else pour ajouter la notification d'erreur :
                //NotificationCenter.default.post(name: Notification.Name(rawValue: errorResponseLoginToActivateSessionNotificationID), object: self)
            case .failure(let error):
                print(error.localizedDescription)
                NotificationCenter.default.post(name: Notification.Name(rawValue: errorServerNotificationID), object: self)
            }
            
        }
    }
    
    //MARK: - NOTIFICATION ACTION
    
    //pour tokenGrab
    @objc private func didOkResponseTokenGrab(){
        
        // je sais que tokenGrab est bien fini je fais ma loginToActivateSession
        loginToActivateSession()
    }
    
    @objc private func didErrorResponseTokenGrab(){
        //j'ai eu une erreur serveur j'affiche un message d'erreur
        //TODO:
    }
    //pour loginToActivateSession
    @objc private func didOkResponseLoginToActivateSession(){
        
        // je sais que loginToActivateSession est bien fini je fais ma header()
        header()
    }
    
    @objc private func didErrorResponseLoginToActivateSession(){
        //j'ai eu une erreur serveur j'affiche un message d'erreur
        
        //TODO:
    }
    
    @objc private func didErrorServer(){
        //j'ai eu une erreur par exemple car mes identifiant n'été pas bon j'affiche un message d'erreur
        
        //TODO:
    }
}

Voilà pour la classe que tu me demander par contre il te faudra faire quelque changement dans ton UIViewController.

premier changement :

    let authentication = ImuseAuthentication()
    authentication.convertPasswordInMD5()
    authentication.tokenGrab()
    authentication.loginToActivateSession()
    authentication.header()

devient :

    let authentication = ImuseAuthentication()
    authentication.convertPasswordInMD5()
    authentication.tokenGrab()

Attention la suite ne fonctionnera pas non plus car comme c’est de l’asynchrone. La suite du code s’exécutera avant la fin des autres requêtes. Du fait il faut que tu continues dans la même logique. Je laisse t’appropriai le code tu devrais arrivé à refaire le même système.
Voilà un résumé de la procédure:

  1. Tu crées une notification (UNIQUE) pour chaque retour différent en dehors des classe s
  2. Tu crées un unique écouteur par notification par classe qui on besoin d’écouté
  3. Tu crées la méthode #selector (@objc func didMyNotif) qui sera appelais quand l’écouteur reçois la notification
  4. Pour chaque écouteur crée tu le détruit dans le destructeur dans la classe ou il a été crée dans le deinit {}
  5. Dans tes requêtes quand elles finissent tu envoies la notifiaction correspondante

Voilà tu devrais t’en sortir.

Enfin! J’ai réussi à aller au bout de l’authentification et au chargement d’une page accessible après s’être loggé.
Je publierai prochainement ma réalisation après un peu de nettoyage pour avoir un retour pour l’optimisation de ce code.

Maintenant j’ai donc la page distante qui se charge mais je n’ai que la structure du site. Le contenu de la page est extrait d’une base de donnée.

Je vais chercher comment récupérer le contenu de la base de donnée car c’est avant tout ces infos qui m’intéressent.

Merci beaucoup pour toute l’aide apportée, j’ai beaucoup appris.
@+

De rien, avec plaisir :smiley:
Pour ce qui es de la base de données, si tu as besoin envoi moi un MP

Damien

Bonjour,
voici mon code mis à jour, cela pourra peut-être servir.

ViewController.swift

import UIKit
import Alamofire

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

//MARK: - DESTRUCTOR

//attention toujours detruire les ecouteurs pour eviter les fuites mémoires quand tu crées un ecouteur tu le détruit dans le destructeur de la classe ou il a été créer.
deinit {
    //pour loginToActivateSession
    NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: errorResponseLoginToActivateSessionNotificationID), object: nil)
    NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: okResponseLoginToActivateSessionNotificationID), object: nil)
    
}

var _authentication = ImuseAuthentication()
let _urlEleves = "https://www.monsitweb.php"


override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    //pour loginToActivateSession
    NotificationCenter.default.addObserver(self, selector: #selector(didOkResponseLoginToActivateSession), name: Notification.Name(rawValue: okResponseLoginToActivateSessionNotificationID), object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(didErrorResponseLoginToActivateSession), name: Notification.Name(rawValue: errorResponseLoginToActivateSessionNotificationID), object: nil)
    
    
    _authentication.convertPasswordInMD5()
    _authentication.tokenGrab() // enchaîne les fonctions tokenGrab() header() et loginToActivateSession() qui lorsqu'elle est ok permet le lancement de loadContent()
    
}


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

//pour loginToActivateSession
@objc private func didOkResponseLoginToActivateSession(){
    // je sais que loginToActivateSession est bien fini je fais ma requête via la fonction
    loadContent()
}

@objc private func didErrorResponseLoginToActivateSession(){
    //j'ai eu une erreur serveur j'affiche un message d'erreur
    print("didErrorResponseLoginToActivateSession")
    //TODO:
}



@objc private func didErrorServer(){
    //j'ai eu une erreur serveur j'affiche un message d'erreur
    print("didErrorServer")
}

private func loadContent() {// private func?
    print("loadcontent")
    // crash en raison du traitement asynchrone d'Alamofire si le token est nil.
    Alamofire.request(_urlEleves, headers : _authentication._headers).responseString { (response) in
        switch response.result {
        case .success:
            //                    print(response.result.value)
            if let htmlBody = response.result.value {
                self.ui_sourceTextView.text = htmlBody
            }
        case .failure(let error):
            self.ui_sourceTextView.text = error.localizedDescription
        }
    }
}

}

Authentication.swift

import Alamofire
import CryptoSwift

// les notifications sont messages qu'on envoie il doit être unique dans le monde d'apple du coup le mieux comme c'est des String c'est de les prefixer par le bundle de l'App
let errorServerNotificationID = "com.monId.ios.monApp.errorServerNotificationID"
//pour tokenGrab
let errorResponseTokenGrabNotificationID = "com.monId.ios.monApp.errorResponseTokenGrabNotificationID"
let okResponseTokenGrabNotificationID = "com.monId.ios.monApp.okResponseTokenGrabNotificationID"
//pour loginToActivateSession
let errorResponseLoginToActivateSessionNotificationID = "com.monId.ios.monApp.errorResponseLoginToActivateSessionNotificationID"
let okResponseLoginToActivateSessionNotificationID = "com.monId.ios.monApp.okResponseLoginToActivateSessionNotificationID"
//pour headers
let errorResponseHeadersNotificationID = "com.monId.ios.monApp.errorResponseHeadersNotificationID"
let okResponseHeadersNotificationID = "com.monId.ios.monApp.okResponseHeadersNotificationID"

class ImuseAuthentication {
    let _urlBeforeIdentification = "https://www.monsite.fr/extranet/login/index.php"
    let _urlIdentification = "https://www.monsite.fr/extranet/login/gen_identification.php"
    let _urlAccueil = "https://www.monsite.fr/extranet/enseignant/ens_enseignant.php"
    let _urlEleves = "https://www.monsite.fr/extranet/eleve/ens_eleve.php"
    let _urlCours = "https://www.monsite.fr/extranet/cours/ens_cours.php"
    
    let _site = 5
    let _login = "monLogin"
    let _originalPassword = "monMotDePasseEnClair" // devra être entré par l'utilisateur via l'UI
    let _groupe = "monGroupe"
    
    var _passwordMd5:String?
    var _tokenValue:String?
    var _tokenName:String?
    var _headers:HTTPHeaders?
    
    //MARK: - CONSTRUCTOR
    init() {
        // j'initialise mes ecouteur dans le constructeur
        //Je vais creer 1 seul ecouteur par message à eccouter par classe ici car ma vue est chargé correctement du coup je sais qu'a se moment la si j'entend que la TokenGrab de la s'est exécuter je peux faire des choses
        // "#selector(didOkResponseTokenGrab)" veux dire que la methode qui va etre appel pour le message "rawValue: okResponseTokenGrabNotificationID" est didOkResponseTokenGrab
        NotificationCenter.default.addObserver(self, selector: #selector(didErrorServer), name: Notification.Name(rawValue: errorServerNotificationID), object: nil)
        //pour tokenGrab
        NotificationCenter.default.addObserver(self, selector: #selector(didOkResponseTokenGrab), name: Notification.Name(rawValue: okResponseTokenGrabNotificationID), object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(didErrorResponseTokenGrab), name: Notification.Name(rawValue: errorResponseTokenGrabNotificationID), object: nil)
        //pour headers
        NotificationCenter.default.addObserver(self, selector: #selector(didErrorServer), name: Notification.Name(rawValue: errorServerNotificationID), object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(didOkResponseHeaders), name: Notification.Name(rawValue: okResponseHeadersNotificationID), object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(didErrorResponseHeaders), name: Notification.Name(rawValue: errorResponseHeadersNotificationID), object: nil)
    }
    
    //MARK: - DESTRUCTOR
    
    //attention toujours detruire les ecouteurs pour eviter les fuites mémoires quand tu crées un ecouteur tu le détruit dans le destructeur de la classe ou il a été créer.
    deinit {
        NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: errorServerNotificationID), object: nil)
        //pour tokenGrab
        NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: errorResponseTokenGrabNotificationID), object: nil)
        NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: okResponseTokenGrabNotificationID), object: nil)
        //pour headers
        NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: errorServerNotificationID), object: nil)
        NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: errorResponseHeadersNotificationID), object: nil)
        NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: okResponseHeadersNotificationID), object: nil)
        
    }
    
    //MARK: - METHODS
    
    func convertPasswordInMD5() {// conversion du mot de passe en clair au format MD5
        _passwordMd5 = _originalPassword.md5()
        print("Mot de passe MD5 : \(String(describing: _passwordMd5))")
    }
    
    func tokenGrab() {// attention chargement asynchrone, il faut trouver un moyen pour que la fonction header se déclenche uniquement lorsque le token est récupéré, c'est le rôle de notifications
        // Fetch Request
        Alamofire.request(_urlBeforeIdentification, method: .get)
            .validate(statusCode: 200..<300)
            .responseString { response in
                if (response.result.error == nil) {
                    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 as Any)
                        print(self._tokenName as Any)
                        
                        //j'envois ma notification de success
                        NotificationCenter.default.post(name: Notification.Name(rawValue: okResponseTokenGrabNotificationID), object: self)
                    }
                }
                else {
                    debugPrint("HTTP Request failed: \(String(describing: response.result.error))")
                    //j'envois ma notification d'erreur
                    NotificationCenter.default.post(name: Notification.Name(rawValue: errorResponseTokenGrabNotificationID), object: self)
                }
        }
    }
    
    func header() {
        if _tokenName == "leNomduToken" {
            //ici de fait des instructions peuvent s’exécuter d'autres notifs si besoin
            let headers: HTTPHeaders = [
                "Cookie" : "cook_user_login_enseignant=\(self._login); cook_user_site_enseignant=\(self._site); \(self._tokenName!)=\(self._tokenValue!)",
            ]
            _headers = headers
            print("En-têtes HTTP dans headers() : \(_headers!)")
            NotificationCenter.default.post(name: Notification.Name(rawValue: okResponseHeadersNotificationID), object: self)
        } else {
            //ici de fait des instructions peuvent s’exécuter d'autres notifs si besoin
            NotificationCenter.default.post(name: Notification.Name(rawValue: errorResponseHeadersNotificationID), object: self)
            print("Erreur : header()")
        }
        
    }
    
    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(response.result.value as Any)
                print("Paramètres de connexion : \(parameters)")
                NotificationCenter.default.post(name: Notification.Name(rawValue: okResponseLoginToActivateSessionNotificationID), object: self)
                
                //TODO : verifier que la réponse attendu et bien celle la if else pour ajouter la notification d'erreur :
                //NotificationCenter.default.post(name: Notification.Name(rawValue: errorResponseLoginToActivateSessionNotificationID), object: self)
                
            case .failure(let error):
                print(error.localizedDescription)
                NotificationCenter.default.post(name: Notification.Name(rawValue: errorServerNotificationID), object: self)
            }
        }
    }
    
    //MARK: - NOTIFICATION ACTION
    
    //pour tokenGrab
    @objc private func didOkResponseTokenGrab(){
        
        // je sais que tokenGrab est bien fini je fais ma fonction header()
        header()
    }
    
    @objc private func didErrorResponseTokenGrab(){
        //j'ai eu une erreur serveur j'affiche un message d'erreur
        //TODO:
    }
    
    //pour header
    @objc private func didOkResponseHeaders(){
        // je sais que header est bien fini je fais ma loginToActivateSession
        loginToActivateSession()
    }
    
    @objc private func didErrorResponseHeaders(){
        //j'ai eu une erreur serveur j'affiche un message d'erreur
        //TODO:
    }
    
    @objc private func didErrorServer(){
        //j'ai eu une erreur par exemple car mes identifiant n'été pas bon j'affiche un message d'erreur
        
        //TODO:
    }
    
}

Voilà.
Merci pour l’aide apportée.
__
universalix

1 « J'aime »