Subversion Repositories Applications.annuaire

Rev

Rev 543 | Rev 550 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 543 Rev 544
Line 227... Line 227...
227
	 * méthodes de l'annuaire
227
	 * méthodes de l'annuaire
228
	 */
228
	 */
229
	protected function deconnexion() {
229
	protected function deconnexion() {
230
		// suppression du cookie
230
		// suppression du cookie
231
		$this->detruireCookie();
231
		$this->detruireCookie();
232
		// envoi d'un jeton vide @TODO évaluer cette méthode
232
		// envoi d'un jeton null
233
		// par rapport à renvoyer simplement NULL comme jeton
-
 
234
		/*$jetonVide = array(
-
 
235
			"iss" => "https://www.tela-botanica.org",
-
 
236
			"sub" => null, // id utilisateur - ou courriel ?
-
 
237
			"iat" => time(),
-
 
238
			"exp" => time(), // @TODO trouver mieux
-
 
239
			"scopes" => array("tela-botanica.org")
-
 
240
		);
-
 
241
		$jwt = JWT::encode($jetonVide, $this->clef);*/
-
 
242
		$jwt = null;
233
		$jwt = null;
243
		$this->envoyerJson(array(
234
		$this->envoyerJson(array(
244
			"session" => false,
235
			"session" => false,
245
			"token" => $jwt,
236
			"token" => $jwt,
246
			"token_id" => $this->nomCookie
237
			"token_id" => $this->nomCookie
247
		));
238
		));
248
	}
239
	}
Line 249... Line 240...
249
 
240
 
250
	/**
241
	/**
251
	 * Renvoie un jeton rafraîchi (durée de validité augmentée de $this->dureeJeton
242
	 * Renvoie un jeton rafraîchi (durée de validité augmentée de $this->dureeJeton
252
	 * si l'utilisateur est reconnu comme détenteur d'une session active (cookie valide
243
	 * si l'utilisateur est reconnu comme détenteur d'une session active (cookie valide,
-
 
244
	 * header HTTP "Authorization" ou jeton valide); renvoie une erreur si le cookie
253
	 * ou jeton valide); renvoie une erreur si le cookie et/ou le jeton sont expirés;
245
	 * et/ou le jeton sont expirés;
254
	 * cela permet en théorie de forger des cookies avec des jetons expirés pour se les
246
	 * cela permet en théorie de forger des cookies avec des jetons expirés pour se les
255
	 * faire rafraîchir franduleusement, mais le canal HTTPS fait qu'un client ne peut
247
	 * faire rafraîchir franduleusement, mais le canal HTTPS fait qu'un client ne peut
256
	 * être en possession que de ses propres jetons... au pire on peut se faire prolonger
248
	 * être en possession que de ses propres jetons... au pire on peut se faire prolonger
257
	 * à l'infini même si on n'est plus inscrit à l'annuaire... @TODO faire mieux un jour
249
	 * à l'infini même si on n'est plus inscrit à l'annuaire... @TODO faire mieux un jour
258
	 * Le cookie est prioritaire sur le paramètre "token" @TODO vérifier cette stratégie
250
	 * Priorité : cookie > headers > paramètre "token" @TODO vérifier cette stratégie
259
	 */
251
	 */
260
	protected function identite() {
252
	protected function identite() {
261
		$cookieAvecJetonValide = false;
253
		$cookieAvecJetonValide = false;
262
		$jetonRetour = null;
254
		$jetonRetour = null;
Line 277... Line 269...
277
				$erreur = "invalid token in cookie";
269
				$erreur = "invalid token in cookie";
278
			}
270
			}
279
		}
271
		}
280
		// si le cookie n'existait pas ou ne contenait pas un jeton
272
		// si le cookie n'existait pas ou ne contenait pas un jeton
281
		if (! $cookieAvecJetonValide) {
273
		if (! $cookieAvecJetonValide) {
-
 
274
			// lire jeton depuis header ou paramètre
-
 
275
			$jwt = $this->lireJetonDansHeader();
-
 
276
			if ($jwt == null) {
282
			// lire jeton
277
				// dernière chance
283
			$jwt = $this->getParam('token');
278
				$jwt = $this->getParam('token');
-
 
279
			}
-
 
280
			// toutes les possibilités ont été essayées
284
			if ($jwt != null) {
281
			if ($jwt != null) {
285
				try {
282
				try {
286
					// rafraîchir jeton si non expiré
283
					// rafraîchir jeton si non expiré
287
					$jetonRetour = $this->rafraichirJeton($jwt);
284
					$jetonRetour = $this->rafraichirJeton($jwt);
288
				} catch (Exception $e) {
285
				} catch (Exception $e) {
289
					// si le rafraîchissement a échoué (jeton invalide, expiré ou vide)
286
					// si le rafraîchissement a échoué (jeton invalide, expiré ou vide)
290
					$erreur = "invalid or expired token in parameter";
287
					$erreur = "invalid or expired token in header or parameter";
291
				}
288
				}
292
			} else {
289
			} else {
293
				// pas de jeton valide passé en paramètre
290
				// pas de jeton valide passé en paramètre
294
				$erreur = ($erreur == "" ? "no token or cookie" : "invalid token in cookie; invalid or expired token in parameter");
291
				$erreur = ($erreur == "" ? "no token or cookie" : "invalid token in cookie / invalid or expired token in header or parameter");
295
			}
292
			}
296
		} 
293
		} 
297
		// renvoi jeton
294
		// renvoi jeton
298
		if ($jetonRetour === null) {
295
		if ($jetonRetour === null) {
299
			$this->erreur($erreur);
296
			$this->erreur($erreur);
Line 417... Line 414...
417
 
414
 
418
		return $jwt;
415
		return $jwt;
Line 419... Line 416...
419
	}
416
	}
-
 
417
 
-
 
418
	/**
-
 
419
	 * Essaye de trouver un jeton JWT non vide dans l'entête HTTP $nomHeader (par
-
 
420
	 * défaut "Authorization")
-
 
421
	 * 
-
 
422
	 * @param string $nomHeader nom de l'entête dans lequel chercher le jeton
-
 
423
	 * @return String un jeton JWT ou null
-
 
424
	 */
-
 
425
	protected function lireJetonDansHeader($nomHeader="Authorization") {
-
 
426
		$jwt = null;
-
 
427
		$headers = apache_request_headers();
-
 
428
		if (isset($headers[$nomHeader]) && ($headers[$nomHeader] != "")) {
-
 
429
			$jwt = $headers[$nomHeader];
-
 
430
		}
-
 
431
		return $jwt;
-
 
432
	}
420
 
433
 
421
	/**
434
	/**
422
	 * Crée un cookie de durée $this->dureeCookie, nommé $this->nomCookie et
435
	 * Crée un cookie de durée $this->dureeCookie, nommé $this->nomCookie et
423
	 * contenant $valeur
436
	 * contenant $valeur
424
	 * 
437
	 *