Subversion Repositories Applications.annuaire

Rev

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

Rev 551 Rev 552
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
186
	 * tout va bien, sinon renvoie une erreur
180
	 * tout va bien, sinon renvoie une erreur et détruit le cookie
187
	 * 
181
	 * 
188
	 * @param array $ressources non utilisé
182
	 * @param array $ressources non utilisé
189
	 */
183
	 */
190
	protected function connexion($ressources) {
184
	protected function connexion($ressources) {
Line 207... Line 201...
207
		}
201
		}
208
		// date de dernière modification du profil
202
		// date de dernière modification du profil
209
		$dateDerniereModif = $util->getDateDerniereModifProfil($infos[$login]['id'], true);
203
		$dateDerniereModif = $util->getDateDerniereModifProfil($infos[$login]['id'], true);
210
		$infos[$login]['dateDerniereModif'] = $dateDerniereModif;
204
		$infos[$login]['dateDerniereModif'] = $dateDerniereModif;
211
		// création du jeton
205
		// création du jeton
212
		$jwt = $this->creerjeton($login, $infos[$login]);
206
		$jwt = $this->creerJeton($login, $infos[$login]);
213
		// création du cookie
207
		// création du cookie
214
		$this->creerCookie($jwt);
208
		$this->creerCookie($jwt);
215
		// envoi
209
		// envoi
216
		$this->envoyerJson(array(
210
		$this->envoyerJson(array(
217
			"session" => true,
211
			"session" => true,
Line 246... Line 240...
246
	 * et/ou le jeton sont expirés;
240
	 * 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
241
	 * 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
242
	 * faire rafraîchir franduleusement, 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
243
	 * ê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
244
	 * à 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
245
	 * Priorité : cookie > headers > paramètre "token" @TODO vérifier cette stratégie, l'inverse
-
 
246
	 * est peut-être plus malin
252
	 */
247
	 */
253
	protected function identite() {
248
	protected function identite() {
254
		$cookieAvecJetonValide = false;
249
		$cookieAvecJetonValide = false;
255
		$jetonRetour = null;
250
		$jetonRetour = null;
256
		$erreur = '';
251
		$erreur = '';
Line 283... Line 278...
283
				try {
278
				try {
284
					// rafraîchir jeton si non expiré
279
					// rafraîchir jeton si non expiré
285
					$jetonRetour = $this->rafraichirJeton($jwt);
280
					$jetonRetour = $this->rafraichirJeton($jwt);
286
				} catch (Exception $e) {
281
				} catch (Exception $e) {
287
					// si le rafraîchissement a échoué (jeton invalide, expiré ou vide)
282
					// si le rafraîchissement a échoué (jeton invalide, expiré ou vide)
288
					$erreur = "invalid or expired token in header or parameter";
283
					$erreur = "invalid or expired token in Authorization header or parameter <token>";
289
				}
284
				}
290
			} else {
285
			} else {
291
				// pas de jeton valide passé en paramètre
286
				// 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");
287
				$erreur = ($erreur == "" ? "no token or cookie" : "invalid token in cookie / invalid or expired token in Authorization header or parameter <token>");
293
			}
288
			}
294
		} 
289
		} 
295
		// renvoi jeton
290
		// renvoi jeton
296
		if ($jetonRetour === null) {
291
		if ($jetonRetour === null) {
297
			$this->erreur($erreur);
292
			$this->erreur($erreur);
Line 312... Line 307...
312
	protected function verifierJeton() {
307
	protected function verifierJeton() {
313
		// vérifie que le jeton provient bien d'ici,
308
		// vérifie que le jeton provient bien d'ici,
314
		// et qu'il est encore valide (date)
309
		// et qu'il est encore valide (date)
315
		$jwt = $this->getParam('token');
310
		$jwt = $this->getParam('token');
316
		if ($jwt == '') {
311
		if ($jwt == '') {
-
 
312
			$jwt = $this->lireJetonDansHeader();
-
 
313
			if ($jwt == null) {
317
			$this->erreur("parameter <token> required");
314
				$this->erreur("parameter <token> or Authorization header required");
-
 
315
			}
318
		}
316
		}
319
		try {
317
		try {
320
			$jeton = JWT::decode($jwt, $this->clef, array('HS256'));
318
			$jeton = JWT::decode($jwt, $this->clef, array('HS256'));
321
			$jeton = (array) $jeton;
319
			$jeton = (array) $jeton;
322
		} catch (Exception $e) {
320
		} catch (Exception $e) {
Line 357... Line 355...
357
			}
355
			}
358
		}
356
		}
359
		// vérification des infos
357
		// vérification des infos
360
		if (empty($infos['sub'])) {
358
		if (empty($infos['sub'])) {
361
			// jeton vide (wtf?)
359
			// jeton vide (wtf?)
362
			echo " #Jeton vide";
-
 
363
			throw new Exception("empty token (no <sub>)");
360
			throw new Exception("empty token (no <sub>)");
364
		}
361
		}
365
		// rafraîchissement
362
		// rafraîchissement
366
		$infos['exp'] = time() + $this->dureeJeton;
363
		$infos['exp'] = time() + $this->dureeJeton;
367
		$jwtSortie = JWT::encode($infos, $this->clef);
364
		$jwtSortie = JWT::encode($infos, $this->clef);