49,11 → 49,10 |
|
class identificationSso { |
|
// Attention bien v�rifier la pr�sence des variables suivantes : |
// Attention bien vérifier la présence des variables suivantes : |
// IDEN_UTILISE_SSO, IDEN_URL_SSO, IDEN_HEADER_SSO, IDEN_COOKIE_SSO |
// dans le fichier iden_config.inc.php |
private $cookie_tentative_identification = ""; |
/** Une tentative par minute pour s'identifier suffit largement */ |
private $delai_tentative_identification = 60; |
|
private $auth_header = 'Authorization'; |
74,8 → 73,8 |
$this->auth_header = IDEN_HEADER_SSO; |
$this->annuaire_url = IDEN_URL_SSO; |
|
// c'est moche mais je n'ai pas trouv� plus simple pour r�cuperer la table annuaire en cours |
// d'utilisation pour le site actuel (la bdd annuaire est la derni�re partie du dsn) |
// c'est moche mais je n'ai pas trouvé plus simple pour récuperer la table annuaire en cours |
// d'utilisation pour le site actuel (la bdd annuaire est la dernière partie du dsn) |
$dsn_annuaire = $this->communs_papyrus['info_auth_bdd']->gsab_dsn; |
$dsn_annuaire = explode('/', $dsn_annuaire); |
$this->bdd_annuaire = end($dsn_annuaire); |
89,9 → 88,9 |
// Premier essai, dans le header |
$headers = @apache_request_headers(); |
$token = !empty($headers['Authorization']) ? $headers['Authorization'] : null; |
// Eventuellement, le jeton a pu �tre pass� dans un header non standard, comme dans |
// le cas o� le header Authorization est supprim� par le mod cgi d'apache |
// Dans ce cas l� on v�rifie aussi dans un header alternatif si celui ci a �t� renseign� |
// Eventuellement, le jeton a pu être passé dans un header non standard, comme dans |
// le cas où le header Authorization est supprimé par le mod cgi d'apache |
// Dans ce cas là on vérifie aussi dans un header alternatif si celui ci a été renseigné |
if($token == null && $this->auth_header != 'Authorization') { |
$token = !empty($headers[$this->auth_header]) ? $headers[$this->auth_header] : null; |
} |
119,7 → 118,7 |
return rtrim(preg_replace('/([?&])'.$var.'=[^&]+(&|$)/','$1',$url), '&?'); |
} |
|
function connecterEtRediriger() { |
function connecterEtRediriger($utilisateur, $pass) { |
$url_redirect = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; |
$params = 'login='.$_POST['username'].'&password='.$_POST['password'].'&redirect_url='.urlencode($url_redirect); |
$connexion_url = $this->annuaire_url."connexion?".$params; |
139,80 → 138,59 |
} |
|
function verifierIdentiteEtRediriger() { |
// si on fait autre chose qu'un GET, on ne vérifie pas l'identité, car |
// cela conduirait à une redirection en GET (avec le jeton), qui |
// supprimerait les données du corps de la requête |
if ($_SERVER['REQUEST_METHOD'] == "GET") { |
if(empty($_COOKIE['sso_tentative_identification'])) { |
|
if(empty($_COOKIE['sso_tentative_identification'])) { |
|
if($this->communs_papyrus['pear_auth']->getAuth()) { |
if($this->communs_papyrus['pear_auth']->getAuth()) { |
|
$cookie_persistant_nom = session_name().'-memo'; |
$cookie_utilisateur_nom = session_name().'-utilisateur'; |
|
// Si l'utilisateur est déjà connecté par pear |
// on fait tout de même une opération de logout |
// pour coordonner la déconnection depuis une autre application |
$this->communs_papyrus['pear_auth']->logout(); |
// Destruction du cookie de session de Papyrus : est ce utile? |
setcookie(session_name(), session_id(), time()-3600, '/'); |
// Destruction du cookie de permanence de l'identitification de Papyrus |
setcookie($cookie_persistant_nom, '', time()-3600, '/'); |
setcookie($cookie_utilisateur_nom, '', time()-3600, '/'); |
} |
|
$url_redirect = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; |
$url = $this->annuaire_url."identite?redirect_url=".urlencode($url_redirect); |
|
// une tentative par minute pour s'identifier suffit largement |
setcookie($this->cookie_tentative_identification, 1, time()+60, '/'); |
|
header('Location: '.$url); |
|
} else { |
$jeton = $this->getToken(); |
|
$cookie_persistant_nom = session_name().'-memo'; |
$cookie_utilisateur_nom = session_name().'-utilisateur'; |
|
// Si l'utilisateur est d�j� connect� par pear |
// on fait tout de m�me une op�ration de logout |
// pour coordonner la d�connection depuis une autre application |
$this->communs_papyrus['pear_auth']->logout(); |
// Destruction du cookie de session de Papyrus : est ce utile? |
setcookie(session_name(), session_id(), time()-3600, '/'); |
// Destruction du cookie de permanence de l'identitification de Papyrus |
setcookie($cookie_persistant_nom, '', time()-3600, '/'); |
setcookie($cookie_utilisateur_nom, '', time()-3600, '/'); |
if($jeton != null) { |
$jeton_decode = $this->decoderToken($jeton); |
|
// Récupération du mot de passe pour remplir les infos de l'objet PEAR Auth |
$requete = 'SELECT '.$this->champ_mdp.' '. |
'FROM '.$this->bdd_annuaire.'.'.$this->table_annuaire.' '. |
'WHERE '.$this->champ_login.' = "'.$jeton_decode['sub'].'" '; |
|
// TODO: normalement ça n'est jamais le cas mais que fait t'on si l'utilisateur n'existe pas |
// dans notre base de données ? (au pire il ne sera pas connecté) |
|
$this->communs_papyrus['pear_auth']->username = $jeton_decode['sub']; |
$this->communs_papyrus['pear_auth']->password = $this->communs_papyrus['pear_db']->getOne($requete); |
|
// Le mot de passe est déjà crypté dans la bdd donc il faut indiquer à pear de ne pas le re crytper |
if (isset($this->communs_papyrus['pear_auth']->storage_options)) { |
$this->communs_papyrus['pear_auth']->storage_options['cryptType'] = 'none'; |
} |
|
$url_redirect = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; |
$url = $this->annuaire_url."identite?redirect_url=".urlencode($url_redirect); |
|
// une tentative toutes les $this->delai_tentative_identification |
setcookie($this->cookie_tentative_identification, 1, time() + $this->delai_tentative_identification, '/'); |
|
header('Location: '.$url); |
|
} else { |
$jeton = $this->getToken(); |
|
if($jeton != null) { |
// Verification du jeton aupres de l'annuaire |
$valide = $this->verifierToken($jeton); |
if ($valide === true) { |
$jeton_decode = $this->decoderToken($jeton); |
|
// R�cup�ration du mot de passe pour remplir les infos de l'objet PEAR Auth |
$requete = 'SELECT '.$this->champ_mdp.' '. |
'FROM '.$this->bdd_annuaire.'.'.$this->table_annuaire.' '. |
'WHERE '.$this->champ_login.' = "'.$jeton_decode['sub'].'" '; |
|
// TODO: normalement �a n'est jamais le cas mais que fait t'on si l'utilisateur n'existe pas |
// dans notre base de donn�es ? (au pire il ne sera pas connect�) |
|
$this->communs_papyrus['pear_auth']->username = $jeton_decode['sub']; |
$this->communs_papyrus['pear_auth']->password = $this->communs_papyrus['pear_db']->getOne($requete); |
|
// Le mot de passe est d�j� crypt� dans la bdd donc il faut indiquer � pear de ne pas le re crytper |
if (isset($this->communs_papyrus['pear_auth']->storage_options)) { |
$this->communs_papyrus['pear_auth']->storage_options['cryptType'] = 'none'; |
} |
if (isset($this->communs_papyrus['pear_auth']->storage->options)) { |
$this->communs_papyrus['pear_auth']->storage->options['cryptType'] = 'none'; |
} |
} |
if (isset($this->communs_papyrus['pear_auth']->storage->options)) { |
$this->communs_papyrus['pear_auth']->storage->options['cryptType'] = 'none'; |
} |
} |
} |
} |
|
/** |
* Vérifie un jeton auprès de l'annuaire |
*/ |
protected function verifierToken($token) { |
$verificationServiceURL = $this->annuaire_url . "verifytoken"; |
$verificationServiceURL .= "?token=" . $token; |
|
$info = file_get_contents($verificationServiceURL); |
$info = json_decode($info, true); |
|
return ($info === true); |
} |
} |
?> |