Quick links: Content - sections - sub sections
EN FR
Quick Search Advanced search
 
Page

  [Opened] utiliser son propre driver d'authentification

Posted by tatoun59 on 01/29/2013 17:35

Après vérification dans apache2/access.log j'ai une erreur 500 412

412 correspondant à Precondition Failed, une des préconditions fournies en en-tête de la requête a produit un résulat négatif du côté serveur

Avec ça, je suis bien avancé :-)

  [Opened] Re: utiliser son propre driver d'authentification

Reply #1 Posted by khena on 01/29/2013 17:39

erreur apache par défaut : /var/log/apache2/error.log Ce qui est intéressant, c'est d'avoir la sortie d'erreur du code 500. Parfois, tu as des erreurs PHP en amont de Jelix.

Et je suis d'accord avec ta remarque sur le $pluginParams, chez moi le controller est différent du point d'entrée, je ne me suis pas posé la question...

edit : j'ai posté en même temps désolé ;) effectivement l'erreur n'est pas très claire, mais elle est peut-etre visible dans le log d'erreur, ou dans un fichier php-errors.log ? (bien qu'elle ne semble pas lié à php. Un mauvais headers renvoyé?)

  [Opened] Re: utiliser son propre driver d'authentification

Reply #2 Posted by tatoun59 on 01/30/2013 10:41

As-tu été voir dans les logs si tu as un code erreur pour ta page blanche ? Est-ce 412 comme moi ? Dans la doc, il est dit que pour connecter un utilisateur il faut faire un

jAuth::login(’le_login’, ’le_mot_de_passe_en_clair’)

Le login, c'est l'uid que l'on doit récupérer de CAS mais pour le mot de passe ? On laisse vide ?

  [Opened] utiliser son propre driver d'authentification

Reply #3 Posted by khena on 01/30/2013 14:38

Nop, pas d'erreur 412 dans mes logs... d'ailleurs pas d'erreurs, c'est bien ça qui m’embête :/ Je suis en train de tester une façon de faire pour le CAS, avec récupération du ticket du CAS, qui permettrait de tester l'identification.

Pour ta deuxième question, je reste persuadé qu'il ne faut surtout pas que le mot de passe apparaisse ou soit transmis à Jelix. L'interêt d'une solution SSO est justement de centraliser cette gestion (et sa sécurité) sur un serveur externe. J'ai regardé la base de données de certains outils PHP qui utilisent CAS, entre autre moyen de connexion (comme glpi par exemple), pour les users CAS, le mot de passe est vide ou fixé dans la base de données.

Donc pour notre cas, je considère que tu peux laisser le mot de passe vide (ou fixé) pour le login.

  [Opened] utiliser son propre driver d'authentification

Reply #4 Posted by khena on 01/30/2013 17:05

Effectivement, je vois que dans un des listeners, on teste si le password est différente de ""... donc il vaut mieux passer qq chose dedans.

  [Opened] utiliser son propre driver d'authentification

Reply #5 Posted by khena on 01/30/2013 18:22

Bon, et bien suite à mes différentes tests, j'obtiens une erreur 500, générée par phpCAS "Submitted service does not match initial service" qui signifie, si je la comprends bien, que la requete qui a été utilisée pour la première authentification du serveur CAS n'est pas repassé au serveur CAS lors de la génération du ticket...

On continue demain :)

  [Opened] utiliser son propre driver d'authentification

Reply #6 Posted by laurentj on 01/31/2013 10:57

Bonjour,

Vous ne devez pas lancer l'authentification dans le driver, puisque PHPCas nécessite une redirection. Et les redirections ne sont pas à faire dans les composants, mais dans les contrôleurs !! Si je fait un jAuth::login(), je ne m'attend pas à ce que mon traitement soit subitement arreté par une redirection. J'attend plutôt un boolean !!

Bref, vous cassez l'api en faisant un forceAuthentification() dans le driver.

Vous devez plutôt avoir un contrôleur spécifique, qui sera appelé par le plugin auth quand l'authentification fait défaut (action indiquée donc dans le on_error_action). Et c'est dans cette action que vous redirigez vers le server CAS. Le serveur CAS redirigera après authentification vers ce même contrôleur. Le contrôleur, en fonction de la réponse, mettra en session ce qu'il faut pour votre driver (objet user dans JELIX_USER etc). C'est à dire que votre driver pour jauth ne fera que des contrôles sur ces variables de sessions. Et encore.. Vous devez simplement implémenter createUserObject() et getUser().

C'est tout.

  [Opened] utiliser son propre driver d'authentification

Reply #7 Posted by khena on 02/01/2013 12:29

Effectivement j'obtiens un résultat plutôt concluant avec le controller suivant :

<?php

require_once jApp::getModulePath("hajime")."plugins/auth/cas/phpCAS/CAS.php";

class casauthCtrl extends jController {

  public $pluginParams = array(
        '*'=>array('auth.required'=>false)
		);

	function out(){
			
		$config = jAuth::loadConfig();
		$sDriverName = $config["driver"];
		
		phpCAS::setDebug();
		phpCAS::client(CAS_VERSION_2_0, $config[$sDriverName]['hostname'], intval($config[$sDriverName]['port']), $config[$sDriverName]['context']);
		phpCAS::setNoCasServerValidation();
		phpCAS::forceAuthentication();
		$user = phpCAS::getUser();
		jAuth::login($user , 'CAS');
		
		$rep = $this->getResponse('redirect');
		$rep->action = "home~default:index";
		return $rep;
	}
}

et un simple plugin avec uniquement

    public function createUserObject($login, $password){
    	$user = new stdClass();
		$user->login = phpCAS::getUser();
		$user->password = $password;
		return $user;
    }

    public function getUser($login){
    	return $this->createUserObject($login, "CAS");    	
    }

    public function verifyPassword($login, $password){
		$sUser = phpCAS::getUser();
		if($login == $sUser){
			return $this->createUserObject($login, $password);			
		}else{
			return false;
		} 	
    }

Encore quelques petits trucs à optimiser mais ça a l'air plutôt positif ;)

Merci Laurent!

  [Opened] utiliser son propre driver d'authentification

Reply #8 Posted by laurentj on 02/01/2013 14:00

Pour info, je suis en train de réfléchir à une nouvelle architecture de jAuth pour une future version, afin de permettre d'intégrer plus facilement des systèmes d'authentification externes.

 
Page
  1. utiliser son propre driver d'authentification