[PHP] [Résolu]Utiliser NIS pour l'identification

Bon alors voilà mon problème : le but est de permettre l’identification d’utilisateurs de ma fac en réutilisant leur logins et mots de passe. Pour cela, il faut utiliser NIS. Pour cela, je n’ai rien trouvé de précis pour utiliser ça en PHP sur internet. J’ai vu quelques fonctions dans les différents copier/coller du manuel de PHP sur le net, mais rien de très utile pour créer une fonction qui permette de dire si le couple nom et mot de passe récupéré dans un formulaire est bien celui de l’un de mes collègues de la fac…

Merci de votre aide.

Si tu veux faire ca proprement, tu dois utiliser l’API PAM.
_Avantage: Ca marche avec NIS, LDAP, crypt, whatever: c’est pas toi qui gere.*
_Desavantage: la lib est assez moisie ou plutot moisie

Enfin bref, fouille un peu le net avec php et pam. (tiens autre lien)

PS: Ouh t’as pas du chercher beaucoup. Enfin normalement, c’est mieux via PAM hein.

LoneWolf
PAM, c’est simple. Sauf sur PHP.

Oui, le lien en post-scriptum, c’était la doc de PHP que je n’avais pas trouvé très utile. Je regarde du côté de PAM.

Euh, un truc de ce style ne te convient pas (trouvé sur la page de yp_next):

$entry = yp_next($domain, "passwd.byname", "joe"); if (!$entry) { echo "Plus d'autres entrées.\n"; echo "<!-- " . yp_errno() . ": " . yp_err_string() . " -->"; } $key = key($entry); echo "L'entrée suivante après \"joe\" a la clé " . $key . " et la valeur " . $entry[$key];

Et bien non, ça ne suffit pas, puisqu’on obtient logiquement le mot de passe crypté. Ce qu’il faudrait, c’est pouvoir crypter à nouveau le mot de passe entré en paramètre pour pouvoir le comparer avec ce que renvoie cette fonction. Et si possible le crypter de la même façon que ce qui a été fait lors de la génération du mot de passe pour que la comparaison ramène quelque chose de correct.
Là, je joue avec la fonction crypt() de php et pour l’instant, j’ai surtout obtenu des résultats différents à chaque fois, mais j’ai pas encore tout exploré… C’est d’autant plus la joie que les admins sont très peu chaud pour utiliser PAM.

Edition : Mais en fait on s’en fout, en jouant avec l’argument salt, je suis parvenu à mes fins. Il me reste plus qu’à tester ça à la fac, mais c’est en très très bonne voie.

Pour la postérité et ceux que çà intéresse, voilà le code de la fonction :

[code]function auth_by_nis($login, $password, $nis_domain, $nis_host) {
$resultat = yp_match(yp_get_default_domain(), “passwd.byname”, $login);
print_r($resultat);
if($resultat) {
echo "
Login trouvé. Vérification du mot de passe
";
$table = split(’:’, $resultat, 3);
print_r($table);

	$pw_nis = $table[1];
	echo "Le mot de passe récupéré en argument est : $pw_nis<br/><br/>";
	
	// C'est là dessus qu'on joue pour obtenir la même chose que ce qui est stocké sur le serveur
	$salt=substr($pw_nis, 0, 12);
	$pass_crypt=crypt($password, $salt);
	echo "Le mot de passe crypté est : $pass_crypt<br/>";
	if($pass_crypt == $pw_nis) {
		return 1;
	}
	else {
		return 0;
	}
}
echo "<br/><br/><br/><br/>";
return 0;

}[/code]

Merci ce post m’a bien aide …

pour info vu que php5 ne supporte plus les fonctions yp_*

voila une autre solution :

[code] function auth_by_nis($login, $password) {
$handle = popen(‘ypcat passwd.byname | grep ‘’.$login.’’ 2>&1’, ‘r’);
$resultat = fread($handle, 2096);
pclose($handle);
print_r($resultat);
if($resultat) {
echo "
Login trouvé. Vérification du mot de passe
";
$table = split(’:’, $resultat, 3);
print_r($table);

	 $pw_nis = $table[1];
	 echo "<br/>Le mot de passe récupéré en argument est : $pw_nis<br/>";
	 
	 // C'est là dessus qu'on joue pour obtenir la même chose que ce qui est stocké sur le serveur
	 $salt=substr($pw_nis, 0, 12);
	 $pass_crypt=crypt($password, $salt);
	 echo "Le mot de passe crypté est : $pass_crypt<br/>";
	 if($pass_crypt == $pw_nis) {
		 return 1;
	 }
	 else {
		 return 0;
	 }
 }
 echo "<br/><br/><br/><br/>";
 return 0;

}[/code]