Authentification OpenID
Introduction
Zend_Auth_Adapter_OpenId permet l'authentification à travers un
serveur distant OpenID. Une telle authentification attend que l'utilisateur fournisse à
l'application Web son identifiant OpenID. L'utilisateur est alors redirigé vers un
fournisseur de services OpenID, afin de s'identifier en rapport avec l'application Web
utilisée. Un mot de passe ou un autre procédé est utilisé, et celui-ci n'est jamais
connu de l'application Web originale.
L'identité OpenID est juste une URI qui pointe vers une page avec des
informations décrivant le serveur à utiliser et des informations sur l'utilisateur.
Pour plus d'informations, consultez
le site officiel OpenIDou une version
française OpenIDFrance.
La classe Zend_Auth_Adapter_OpenId utilise
Zend_OpenId_Consumer qui sert à gérer le protocole OpenID.
Zend_OpenId utilise
l'extension GMP, si
disponible. L'utilisation de cette extension est recommandée pour améliorer les
performances de Zend_Auth_Adapter_OpenId.
Spécifications
Comme toute autre classe adaptateur de Zend_Auth,
Zend_Auth_Adapter_OpenId implémente
Zend_Auth_Adapter_Interface, qui définit une seule méthode :
authenticate(). Elle est utilisée pour l'authentification elle-même, une
fois que l'objet est prêt. La préparation d'un objet OpenID nécessite quelques options
à passer à Zend_OpenId.
A la différence des autres adaptateurs Zend_Auth, l'adaptateur
OpenID utilise une authentification sur un serveur externe à l'application, et
nécessitera donc deux requêtes HTTP. Ainsi
Zend_Auth_Adapter_OpenId::authenticate() devra être appelée deux
fois : d'abord pour rediriger l'utilisateur vers le serveur OpenID (rien ne sera donc
retourné par la méthode), qui lui-même redirigera l'utilisateur vers l'application, où
un deuxième appel de méthode
Zend_Auth_Adapter_OpenId::authenticate() vérifiera la signature
et complétera le processus. Un objet Zend_Auth_Result sera alors
cette fois-ci retourné.
L'exemple suivant montre l'utilisation de
Zend_Auth_Adapter_OpenId.
Zend_Auth_Adapter_OpenId::authenticate() est appelée deux fois.
La première fois juste après avoir envoyé le formulaire, lorsque
$_POST['openid_action'] vaut "login", et la deuxième fois
après la redirection du serveur OpenID vers l'application, lorsque
$_GET['openid_mode'] ou $_POST['openid_mode'] existe.
authenticate(
new Zend_Auth_Adapter_OpenId(@$_POST['openid_identifier']));
if ($result->isValid()) {
$status = "You are logged-in as "
. $auth->getIdentity()
. "
\n";
} else {
$auth->clearIdentity();
foreach ($result->getMessages() as $message) {
$status .= "$message
\n";
}
}
} else if ($auth->hasIdentity()) {
if (isset($_POST['openid_action']) &&
$_POST['openid_action'] == "logout") {
$auth->clearIdentity();
} else {
$status = "You are logged-in as "
. $auth->getIdentity()
. "
\n";
}
}
?>
]]>
Il est possible de personnaliser le processus, pour par exemple demander une
redirection du serveur OpenID vers l'application, sur une page différente de la
première. Ceci peut être fait avec des objets personnalisés
Zend_OpenId_Consumer_Storage ou
Zend_Controller_Response. Vous pouvez aussi utiliser le procédé
"Simple Registration" pour récupérer les informations au sujet de l'utilisateur, en
provenance du serveur OpenID. Toutes ces possibilités sont écrites et détaillées dans
le chapitre concernant Zend_OpenId_Consumer.