diff --git a/.gitattributes b/.gitattributes
index 5b20eccffa3c6c0f9a0725e3e94709169c56b6a2..7237a1440fe16695166fb4dfe6cbbb5e901f8630 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -4,6 +4,7 @@ config/ecran_securite.php -text
 config/remove.txt -text
 ecrire/action/acceder_document.php -text
 ecrire/action/activer_plugins.php -text
+ecrire/action/auth.php -text
 ecrire/action/changer_mode_document.php -text
 ecrire/action/charger_plugin.php -text
 ecrire/action/configurer.php -text
diff --git a/ecrire/action/auth.php b/ecrire/action/auth.php
new file mode 100644
index 0000000000000000000000000000000000000000..08a96d03d974f411df6640f55abfc373f276f2b9
--- /dev/null
+++ b/ecrire/action/auth.php
@@ -0,0 +1,45 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2009                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+/**
+ * Retour d'authentification pour les SSO
+ */
+function action_auth_dist() {
+	
+	$securiser_action = charger_fonction('securiser_action', 'inc');
+	$arg = $securiser_action();
+
+	if (!preg_match(",^(\w+)[/](.+)$,", $arg, $r)) {
+		spip_log("action_auth_dist $arg pas compris");
+	}
+	else {
+		$auth_methode = $r[1];
+		$login = $r[2];
+		include_spip('inc/auth');
+		$res = auth_terminer_identifier_login($auth_methode, $login);
+
+		if (is_string($res)){ // Erreur
+			$redirect = _request('redirect');
+			$redirect = parametre_url($redirect,'var_erreur',$res);
+			include_spip('inc/headers');
+			redirige_par_entete($redirect);
+		}
+
+		// sinon on loge l'auteur identifie, et on finit (redirection automatique)
+		auth_loger($res);
+	}
+}
+
+
+?>
\ No newline at end of file
diff --git a/ecrire/inc/auth.php b/ecrire/inc/auth.php
index 5768b5e200e9d82b38732d0dbe12d503bb445dd1..2d6e0992d4402558edfeafe6b7ca1e2396978dd0 100644
--- a/ecrire/inc/auth.php
+++ b/ecrire/inc/auth.php
@@ -295,6 +295,7 @@ function auth_trace($row, $date=null)
 	}
 }
 
+
 /** ----------------------------------------------------------------------------
  * API Authentification, gestion des identites centralisees
  */
@@ -337,6 +338,7 @@ function auth_formulaire_login($flux){
  * qui sera alors converti en login interne apres verification
  *
  * @param string $login
+ * @param string $serveur
  * @return string/bool
  */
 function auth_retrouver_login($login, $serveur=''){
@@ -364,6 +366,7 @@ function auth_retrouver_login($login, $serveur=''){
  * N'y aurait-il pas plus simple ?
  *
  * @param string $login
+ * @param string $serveur
  * @return array
  */
 function auth_informer_login($login, $serveur=''){
@@ -398,8 +401,7 @@ function auth_informer_login($login, $serveur=''){
  *
  * @param string $login
  * @param string $password
- * @param string $md5pass
- * @param string $md5next
+ * @param string $serveur
  * @return mixed
  */
 function auth_identifier_login($login, $password, $serveur=''){
@@ -419,11 +421,61 @@ function auth_identifier_login($login, $password, $serveur=''){
 	return $erreur;
 }
 
+/**
+ * Fournir une url de retour apres login par un SSO
+ * pour finir l'authentification
+ *
+ * @param string $auth_methode
+ * @param string $login
+ * @param string $serveur
+ * @return string
+ */
+function auth_url_retour_login($auth_methode, $login, $redirect='', $serveur=''){
+	$securiser_action = charger_fonction('securiser_action','inc');
+	return $securiser_action('auth', "$auth_methode/$login", $redirect, true);
+}
+
+function auth_terminer_identifier_login($auth_methode, $login, $serveur=''){
+	$args = func_get_args();
+	$auteur = auth_administrer('terminer_identifier_login',$args);
+	return $auteur;
+}
+
+ /**
+  * Loger un auteur suite a son identification
+  *
+  * @param array $auteur
+  */
+ function auth_loger($auteur){
+	if (!is_array($auteur) OR !count($auteur))
+		return false;
+
+	$session = charger_fonction('session', 'inc');
+	$session($auteur);
+	$p = ($auteur['prefs']) ? unserialize($auteur['prefs']) : array();
+	$p['cnx'] = ($session_remember == 'oui') ? 'perma' : '';
+	$p = array('prefs' => serialize($p));
+	sql_updateq('spip_auteurs', $p, "id_auteur=" . $auteur['id_auteur']);
+
+	// Si on est admin, poser le cookie de correspondance
+	if ($auteur['statut'] == '0minirezo') {
+		include_spip('inc/cookie');
+		spip_setcookie('spip_admin', '@'.$auteur['login'],
+		time() + 7 * 24 * 3600);
+	}
+
+	//  bloquer ici le visiteur qui tente d'abuser de ses droits
+	verifier_visiteur();
+	return true;
+}
+
+
 /**
  * Tester la possibilite de modifier le login d'authentification
  * pour la methode donnee
  *
  * @param string $auth_methode
+ * @param string $serveur
  * @return bool
  */
 function auth_autoriser_modifier_login($auth_methode, $serveur=''){
@@ -438,6 +490,7 @@ function auth_autoriser_modifier_login($auth_methode, $serveur=''){
  * @param string $auth_methode
  * @param string $new_login
  * @param int $id_auteur
+ * @param string $serveur
  * @return string
  *  message d'erreur ou chaine vide si pas d'erreur
  */
@@ -452,6 +505,7 @@ function auth_verifier_login($auth_methode, $new_login, $id_auteur=0, $serveur='
  * @param string $auth_methode
  * @param string $new_login
  * @param int $id_auteur
+ * @param string $serveur
  * @return bool
  */
 function auth_modifier_login($auth_methode, $new_login, $id_auteur, $serveur=''){
@@ -464,6 +518,7 @@ function auth_modifier_login($auth_methode, $new_login, $id_auteur, $serveur='')
  * pour la methode donnee
  *
  * @param string $auth_methode
+ * @param string $serveur
  * @return bool
  *	succes ou echec
  */
@@ -480,6 +535,7 @@ function auth_autoriser_modifier_pass($auth_methode, $serveur=''){
  * @param string $login
  * @param string $new_pass
  * @param int $id_auteur
+ * @param string $serveur
  * @return string
  *	message d'erreur ou chaine vide si pas d'erreur
  */
@@ -496,6 +552,7 @@ function auth_verifier_pass($auth_methode, $login, $new_pass, $id_auteur=0, $ser
  * @param string $login
  * @param string $new_pass
  * @param int $id_auteur
+ * @param string $serveur
  * @return bool
  *	succes ou echec
  */
@@ -513,6 +570,7 @@ function auth_modifier_pass($auth_methode, $login, $new_pass, $id_auteur, $serve
  * @param int $id_auteur
  * @param array $champs
  * @param array $options
+ * @param string $serveur
  * @return void
  */
 function auth_synchroniser_distant($auth_methode=true, $id_auteur=0, $champs=array(), $options = array(), $serveur=''){
@@ -531,6 +589,13 @@ function auth_synchroniser_distant($auth_methode=true, $id_auteur=0, $champs=arr
 }
 
 
+/**
+ *
+ * @param string $login
+ * @param string $pw
+ * @param string $serveur
+ * @return array
+ */
 function lire_php_auth($login, $pw, $serveur=''){
 	// en auth php, le login est forcement celui en base
 	// pas la peine de passer par la methode auth/xxx pour identifier le login
@@ -552,10 +617,16 @@ function lire_php_auth($login, $pw, $serveur=''){
 	return false;
 }
 
-//
-// entete php_auth (est-encore utilise ?)
-//
-// http://doc.spip.org/@ask_php_auth
+/**
+ * entete php_auth (est-encore utilise ?)
+ *
+ * @param <type> $pb
+ * @param <type> $raison
+ * @param <type> $retour
+ * @param <type> $url
+ * @param <type> $re
+ * @param <type> $lien
+ */
 function ask_php_auth($pb, $raison, $retour, $url='', $re='', $lien='') {
 	@Header("WWW-Authenticate: Basic realm=\"espace prive\"");
 	@Header("HTTP/1.0 401 Unauthorized");
diff --git a/prive/formulaires/login.php b/prive/formulaires/login.php
index e2ae5814001b5571fd5b8d93e6959ae5016281f1..2a45085d2f0e01a72438bcfa4f87ac7b3b8a85cd 100644
--- a/prive/formulaires/login.php
+++ b/prive/formulaires/login.php
@@ -24,6 +24,11 @@ function formulaires_login_charger_dist($cible="",$login="",$prive=null)
 	$erreur = _request('var_erreur');
 
 	if (!$login) $login = _request('var_login');
+	// si on est deja identifie
+	if (!$login AND isset($GLOBALS['visiteur_session']['login'])) {
+		$login = $GLOBALS['visiteur_session']['login'];
+	}
+	// ou si on a un cookie admin
 	if (!$login) {
 		if (isset($_COOKIE['spip_admin'])
 		AND preg_match(",^@(.*)$,", $_COOKIE['spip_admin'], $regs))
@@ -55,7 +60,9 @@ function formulaires_login_charger_dist($cible="",$login="",$prive=null)
 	if (is_null($prive) ? is_url_prive($cible) : $prive) {
 		include_spip('inc/autoriser');
 		$loge = autoriser('ecrire');
-	} else 	$loge = ($GLOBALS['visiteur_session']['auth'] != '');
+	} 
+	else
+		$loge = ($GLOBALS['visiteur_session']['auth'] != '');
 
 	// Si on est connecte, appeler traiter()
 	// et lancer la redirection si besoin
@@ -113,8 +120,13 @@ function formulaires_login_verifier_dist($cible="",$login="",$prive=null){
 				array('login' => htmlspecialchars($login))));
 	}
 
+	// appeler auth_identifier_login qui va :
+	// - renvoyer un string si echec (message d'erreur)
+	// - un array decrivant l'auteur identifie si possible
+	// - rediriger vers un SSO qui renverra in fine sur action/auth qui finira l'authentification
 	include_spip('inc/auth');
 	$auteur = auth_identifier_login($session_login, $session_password);
+	// on arrive ici si on ne s'est pas identifie avec un SSO
 	if (!is_array($auteur)) {
 		$erreurs = array();
 		if (is_string($auteur))
@@ -134,14 +146,8 @@ function formulaires_login_verifier_dist($cible="",$login="",$prive=null){
 	// en gerant la duree demandee pour son cookie 
 	if ($session_remember !== NULL)
 		$auteur['cookie'] = $session_remember;
-	$session = charger_fonction('session', 'inc');
-	$session($auteur);
-	$p = ($auteur['prefs']) ? unserialize($auteur['prefs']) : array();
-	$p['cnx'] = ($session_remember == 'oui') ? 'perma' : '';
-	$p = array('prefs' => serialize($p));
-	sql_updateq('spip_auteurs', $p, "id_auteur=" . $auteur['id_auteur']);
-	//  bloquer ici le visiteur qui tente d'abuser de ses droits
-	verifier_visiteur();
+	auth_loger($auteur);
+
 	return (is_null($prive) ? is_url_prive($cible) : $prive)
 	?  login_autoriser() : array();
 }