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 |
* |