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.
}
}