Subversion Repositories Applications.annuaire

Rev

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

Rev 550 Rev 555
Line 76... Line 76...
76
					"alias" => array(
76
					"alias" => array(
77
						$uri . "identity",
77
						$uri . "identity",
78
						$uri . "rafraichir",
78
						$uri . "rafraichir",
79
						$uri . "refresh"
79
						$uri . "refresh"
80
					),
80
					),
81
					"description" => "confirme l'authentification et la session; rafraîchit le jeton fourni (dans le cookie " . $this->nomCookie . " ou en paramètre)"
81
					"description" => "confirme l'authentification et la session; rafraîchit le jeton fourni (dans le cookie " . $this->nomCookie . ", le header Authorization ou en paramètre)"
82
				),
82
				),
83
				'verifierjeton' => array(
83
				'verifierjeton' => array(
84
					"uri" => $uri . "identite",
84
					"uri" => $uri . "verifierjeton",
85
					"parametres" => array(
85
					"parametres" => array(
86
						"token" => "jeton JWT",
86
						"token" => "jeton JWT",
87
					),
87
					),
88
					"alias" => $uri . "verifytoken",
88
					"alias" => $uri . "verifytoken",
89
					"description" => "retourne true si le jeton fourni en paramètre est valide, une erreur sinon"
89
					"description" => "retourne true si le jeton fourni en paramètre ou dans le header Authorization est valide, une erreur sinon"
90
				)
90
				)
91
			)
91
			)
92
		);
92
		);
93
		$this->envoyerJson($infos);
93
		$this->envoyerJson($infos);
94
	}
94
	}
Line 109... Line 109...
109
	 * @param array $ressources les éléments d'URL
109
	 * @param array $ressources les éléments d'URL
110
	 */
110
	 */
111
	public function getElement($ressources) {
111
	public function getElement($ressources) {
112
		// Achtétépéèch portouguech lolch
112
		// Achtétépéèch portouguech lolch
113
		$this->verifierSSL();
113
		$this->verifierSSL();
114
		//echo "get element\n";
-
 
115
		//var_dump($ressources);
-
 
116
		// le premier paramètre d'URL définit la méthode (non-magique)
114
		// le premier paramètre d'URL définit la méthode (non-magique)
117
		if (count($ressources) > 0) {
115
		if (count($ressources) > 0) {
118
			switch ($ressources[0]) {
116
			switch ($ressources[0]) {
119
				case 'login':
117
				case 'login':
120
				case 'connexion':
118
				case 'connexion':
Line 149... Line 147...
149
	 * @param array $ressources les éléments d'URL
147
	 * @param array $ressources les éléments d'URL
150
	 * @param array $pairs les paramètres POST
148
	 * @param array $pairs les paramètres POST
151
	 */
149
	 */
152
	public function updateElement($ressources, $pairs) {
150
	public function updateElement($ressources, $pairs) {
153
		//echo "update element\n";
151
		//echo "update element\n";
154
		//var_dump($ressources);
-
 
155
		//var_dump($pairs);
-
 
156
		$this->nonImplemente();
152
		$this->nonImplemente();
157
	}
153
	}
Line 158... Line 154...
158
 
154
 
159
	/**
155
	/**
Line 162... Line 158...
162
	 * 
158
	 * 
163
	 * @param array $pairs les paramètres POST
159
	 * @param array $pairs les paramètres POST
164
	 */
160
	 */
165
	public function createElement($pairs) {
161
	public function createElement($pairs) {
166
		//echo "create element\n";
162
		//echo "create element\n";
167
		//var_dump($pairs);
-
 
168
		$this->nonImplemente();
163
		$this->nonImplemente();
169
	}
164
	}
Line 170... Line 165...
170
 
165
 
171
	/**
166
	/**
Line 174... Line 169...
174
	 * 
169
	 * 
175
	 * @param array $ressources les éléments d'URL
170
	 * @param array $ressources les éléments d'URL
176
	 */
171
	 */
177
	public function deleteElement($ressources) {
172
	public function deleteElement($ressources) {
178
		//echo "delete element\n";
173
		//echo "delete element\n";
179
		//var_dump($ressources);
-
 
180
		$this->nonImplemente();
174
		$this->nonImplemente();
181
	}
175
	}
Line 182... Line 176...
182
 
176
 
183
	/**
177
	/**
184
	 * Vérifie l'identité d'un utilisateur à partir de son courriel et son
178
	 * Vérifie l'identité d'un utilisateur à partir de son courriel et son
185
	 * mot de passe ou d'un cookie; lui accorde un jeton et un cookie si
179
	 * mot de passe ou d'un cookie; lui accorde un jeton et un cookie si
-
 
180
	 * tout va bien, sinon renvoie une erreur et détruit le cookie
-
 
181
	 * @WARNING si vous n'utilisez pas urlencode() pour fournir le mot de passe,
186
	 * tout va bien, sinon renvoie une erreur
182
	 * le caractère "&" posera problème en GET
187
	 * 
183
	 * 
188
	 * @param array $ressources non utilisé
184
	 * @param array $ressources non utilisé
189
	 */
185
	 */
190
	protected function connexion($ressources) {
186
	protected function connexion($ressources) {
Line 207... Line 203...
207
		}
203
		}
208
		// date de dernière modification du profil
204
		// date de dernière modification du profil
209
		$dateDerniereModif = $util->getDateDerniereModifProfil($infos[$login]['id'], true);
205
		$dateDerniereModif = $util->getDateDerniereModifProfil($infos[$login]['id'], true);
210
		$infos[$login]['dateDerniereModif'] = $dateDerniereModif;
206
		$infos[$login]['dateDerniereModif'] = $dateDerniereModif;
211
		// création du jeton
207
		// création du jeton
212
		$jwt = $this->creerjeton($login, $infos[$login]);
208
		$jwt = $this->creerJeton($login, $infos[$login]);
213
		// création du cookie
209
		// création du cookie
214
		$this->creerCookie($jwt);
210
		$this->creerCookie($jwt);
215
		// envoi
211
		// envoi
216
		$this->envoyerJson(array(
212
		$this->envoyerJson(array(
217
			"session" => true,
213
			"session" => true,
Line 243... Line 239...
243
	 * Renvoie un jeton rafraîchi (durée de validité augmentée de $this->dureeJeton
239
	 * Renvoie un jeton rafraîchi (durée de validité augmentée de $this->dureeJeton
244
	 * si l'utilisateur est reconnu comme détenteur d'une session active (cookie valide,
240
	 * si l'utilisateur est reconnu comme détenteur d'une session active (cookie valide,
245
	 * header HTTP "Authorization" ou jeton valide); renvoie une erreur si le cookie
241
	 * header HTTP "Authorization" ou jeton valide); renvoie une erreur si le cookie
246
	 * et/ou le jeton sont expirés;
242
	 * et/ou le jeton sont expirés;
247
	 * cela permet en théorie de forger des cookies avec des jetons expirés pour se les
243
	 * cela permet en théorie de forger des cookies avec des jetons expirés pour se les
248
	 * faire rafraîchir franduleusement, mais le canal HTTPS fait qu'un client ne peut
244
	 * faire rafraîchir frauduleusement, mais le canal HTTPS fait qu'un client ne peut
249
	 * être en possession que de ses propres jetons... au pire on peut se faire prolonger
245
	 * être en possession que de ses propres jetons... au pire on peut se faire prolonger
250
	 * à l'infini même si on n'est plus inscrit à l'annuaire... @TODO faire mieux un jour
246
	 * à l'infini même si on n'est plus inscrit à l'annuaire... @TODO faire mieux un jour
251
	 * Priorité : cookie > headers > paramètre "token" @TODO vérifier cette stratégie
247
	 * Priorité : cookie > header "Authorization" > paramètre "token" @TODO vérifier cette
-
 
248
	 * stratégie, l'inverse est peut-être plus malin
252
	 */
249
	 */
253
	protected function identite() {
250
	protected function identite() {
254
		$cookieAvecJetonValide = false;
251
		$cookieAvecJetonValide = false;
255
		$jetonRetour = null;
252
		$jetonRetour = null;
256
		$erreur = '';
253
		$erreur = '';
Line 283... Line 280...
283
				try {
280
				try {
284
					// rafraîchir jeton si non expiré
281
					// rafraîchir jeton si non expiré
285
					$jetonRetour = $this->rafraichirJeton($jwt);
282
					$jetonRetour = $this->rafraichirJeton($jwt);
286
				} catch (Exception $e) {
283
				} catch (Exception $e) {
287
					// si le rafraîchissement a échoué (jeton invalide, expiré ou vide)
284
					// si le rafraîchissement a échoué (jeton invalide, expiré ou vide)
288
					$erreur = "invalid or expired token in header or parameter";
285
					$erreur = "invalid or expired token in Authorization header or parameter <token>";
289
				}
286
				}
290
			} else {
287
			} else {
291
				// pas de jeton valide passé en paramètre
288
				// pas de jeton valide passé en paramètre
292
				$erreur = ($erreur == "" ? "no token or cookie" : "invalid token in cookie / invalid or expired token in header or parameter");
289
				$erreur = ($erreur == "" ? "no token or cookie" : "invalid token in cookie / invalid or expired token in Authorization header or parameter <token>");
293
			}
290
			}
294
		} 
291
		} 
295
		// renvoi jeton
292
		// renvoi jeton
296
		if ($jetonRetour === null) {
293
		if ($jetonRetour === null) {
297
			$this->erreur($erreur);
294
			$this->erreur($erreur);
Line 305... Line 302...
305
		}
302
		}
306
	}
303
	}
Line 307... Line 304...
307
 
304
 
308
	/**
305
	/**
309
	 * Vérifie si un jeton est valide; retourne true si oui, une erreur avec
306
	 * Vérifie si un jeton est valide; retourne true si oui, une erreur avec
-
 
307
	 * des détails si non;
310
	 * des détails si non
308
	 * Priorité : header "Authorization" > paramètre "token"
311
	 */
309
	 */
312
	protected function verifierJeton() {
310
	protected function verifierJeton() {
313
		// vérifie que le jeton provient bien d'ici,
311
		// vérifie que le jeton provient bien d'ici,
-
 
312
		// et qu'il est encore valide (date)
-
 
313
		$jwt = $this->lireJetonDansHeader();
314
		// et qu'il est encore valide (date)
314
		if ($jwt == null) {
315
		$jwt = $this->getParam('token');
315
			$jwt = $this->getParam('token');
316
		if ($jwt == '') {
316
			if ($jwt == '') {
-
 
317
				$this->erreur("parameter <token> or Authorization header required");
317
			$this->erreur("parameter <token> required");
318
			}
318
		}
319
		}
319
		try {
320
		try {
320
			$jeton = JWT::decode($jwt, $this->clef, array('HS256'));
321
			$jeton = JWT::decode($jwt, $this->clef, array('HS256'));
321
			$jeton = (array) $jeton;
322
			$jeton = (array) $jeton;
322
		} catch (Exception $e) {
323
		} catch (Exception $e) {
323
			$this->erreur($e->getMessage());
324
			$this->erreur($e->getMessage());
324
			exit;
325
			exit;
325
		}
-
 
326
		//print_r($jeton);
326
		}
327
		$this->envoyerJson(true);
327
		$this->envoyerJson(true);
Line 328... Line 328...
328
	}
328
	}
329
 
329
 
Line 357... Line 357...
357
			}
357
			}
358
		}
358
		}
359
		// vérification des infos
359
		// vérification des infos
360
		if (empty($infos['sub'])) {
360
		if (empty($infos['sub'])) {
361
			// jeton vide (wtf?)
361
			// jeton vide (wtf?)
362
			echo " #Jeton vide";
-
 
363
			throw new Exception("empty token (no <sub>)");
362
			throw new Exception("empty token (no <sub>)");
364
		}
363
		}
365
		// rafraîchissement
364
		// rafraîchissement
366
		$infos['exp'] = time() + $this->dureeJeton;
365
		$infos['exp'] = time() + $this->dureeJeton;
367
		$jwtSortie = JWT::encode($infos, $this->clef);
366
		$jwtSortie = JWT::encode($infos, $this->clef);