Subversion Repositories Applications.annuaire

Compare Revisions

Ignore whitespace Rev 543 → Rev 544

/trunk/jrest/services/Auth.php
229,16 → 229,7
protected function deconnexion() {
// suppression du cookie
$this->detruireCookie();
// envoi d'un jeton vide @TODO évaluer cette méthode
// par rapport à renvoyer simplement NULL comme jeton
/*$jetonVide = array(
"iss" => "https://www.tela-botanica.org",
"sub" => null, // id utilisateur - ou courriel ?
"iat" => time(),
"exp" => time(), // @TODO trouver mieux
"scopes" => array("tela-botanica.org")
);
$jwt = JWT::encode($jetonVide, $this->clef);*/
// envoi d'un jeton null
$jwt = null;
$this->envoyerJson(array(
"session" => false,
249,13 → 240,14
 
/**
* Renvoie un jeton rafraîchi (durée de validité augmentée de $this->dureeJeton
* si l'utilisateur est reconnu comme détenteur d'une session active (cookie valide
* ou jeton valide); renvoie une erreur si le cookie et/ou le jeton sont expirés;
* si l'utilisateur est reconnu comme détenteur d'une session active (cookie valide,
* header HTTP "Authorization" ou jeton valide); renvoie une erreur si le cookie
* et/ou le jeton sont expirés;
* cela permet en théorie de forger des cookies avec des jetons expirés pour se les
* faire rafraîchir franduleusement, mais le canal HTTPS fait qu'un client ne peut
* être en possession que de ses propres jetons... au pire on peut se faire prolonger
* à l'infini même si on n'est plus inscrit à l'annuaire... @TODO faire mieux un jour
* Le cookie est prioritaire sur le paramètre "token" @TODO vérifier cette stratégie
* Priorité : cookie > headers > paramètre "token" @TODO vérifier cette stratégie
*/
protected function identite() {
$cookieAvecJetonValide = false;
279,8 → 271,13
}
// si le cookie n'existait pas ou ne contenait pas un jeton
if (! $cookieAvecJetonValide) {
// lire jeton
$jwt = $this->getParam('token');
// lire jeton depuis header ou paramètre
$jwt = $this->lireJetonDansHeader();
if ($jwt == null) {
// dernière chance
$jwt = $this->getParam('token');
}
// toutes les possibilités ont été essayées
if ($jwt != null) {
try {
// rafraîchir jeton si non expiré
287,11 → 284,11
$jetonRetour = $this->rafraichirJeton($jwt);
} catch (Exception $e) {
// si le rafraîchissement a échoué (jeton invalide, expiré ou vide)
$erreur = "invalid or expired token in parameter";
$erreur = "invalid or expired token in header or parameter";
}
} else {
// pas de jeton valide passé en paramètre
$erreur = ($erreur == "" ? "no token or cookie" : "invalid token in cookie; invalid or expired token in parameter");
$erreur = ($erreur == "" ? "no token or cookie" : "invalid token in cookie / invalid or expired token in header or parameter");
}
}
// renvoi jeton
419,6 → 416,22
}
 
/**
* Essaye de trouver un jeton JWT non vide dans l'entête HTTP $nomHeader (par
* défaut "Authorization")
*
* @param string $nomHeader nom de l'entête dans lequel chercher le jeton
* @return String un jeton JWT ou null
*/
protected function lireJetonDansHeader($nomHeader="Authorization") {
$jwt = null;
$headers = apache_request_headers();
if (isset($headers[$nomHeader]) && ($headers[$nomHeader] != "")) {
$jwt = $headers[$nomHeader];
}
return $jwt;
}
 
/**
* Crée un cookie de durée $this->dureeCookie, nommé $this->nomCookie et
* contenant $valeur
*