El adaptador Zend_Auth_Adapter_OpenId se puede usar para autenticar
usuarios utilizando servidores OpenID remotos. Este método de autenticación asume que el usuario
envía únicamente su identidad OpenID a la aplicación web. Luego
son redirigidos a su proveedor OpenID para demostrar la propiedad de la identidad
usando una contraseña u otro método. Esta contraseña nunca se proporciona
a la aplicación web.
La identidad OpenID es simplemente una URI que apunta a un sitio web con información sobre un usuario, junto con etiquetas especiales que describen qué servidor usar y qué identidad enviar allí. Puede leer más sobre OpenID en el sitio oficial de OpenID.
La clase Zend_Auth_Adapter_OpenId envuelve
el componente Zend_OpenId_Consumer, que implementa el
protocolo de autenticación OpenID en sí mismo.
![]() |
Nota |
|---|---|
|
Como es el caso de todos los adaptadores de Zend_Auth, la clase
Zend_Auth_Adapter_OpenId implementa
Zend_Auth_Adapter_Interface, que define un método:
authenticate(). Este método realiza la autenticación en sí misma,
pero el objeto debe prepararse antes de invocarlo. Dicha preparación del adaptador incluye
configurar la identidad OpenID y algunas otras opciones específicas de
Zend_OpenId.
Sin embargo, a diferencia de otros adaptadores de Zend_Auth,
Zend_Auth_Adapter_OpenId realiza la autenticación en un servidor
externo en dos peticiones HTTP separadas. Por lo tanto, el
método Zend_Auth_Adapter_OpenId::authenticate() debe llamarse
dos veces. En la primera invocación, el método no retorna, sino que
redirige al usuario a su servidor OpenID. Luego, después de que el usuario se autentica en el servidor
remoto, será redirigido de vuelta y el script para esta segunda petición debe llamar de nuevo a
Zend_Auth_Adapter_OpenId::authenticate() para verificar la
firma que viene con la petición redirigida del servidor para completar el
proceso de autenticación. En esta segunda invocación, el método devolverá el
objeto Zend_Auth_Result como se espera.
El siguiente ejemplo muestra el uso de
Zend_Auth_Adapter_OpenId. Como se mencionó anteriormente, el método
Zend_Auth_Adapter_OpenId::authenticate() debe llamarse dos
veces. La primera vez es después de que el usuario envía el formulario HTML con
$_POST['openid_action'] establecido en "login",
y la segunda vez es después de la redirección HTTP desde el servidor OpenID
con $_GET['openid_mode'] o
$_POST['openid_mode'] establecidos.
<?php
$status = "";
$auth = Zend_Auth::getInstance();
if ((isset($_POST['openid_action']) &&
$_POST['openid_action'] == "login" &&
!empty($_POST['openid_identifier'])) ||
isset($_GET['openid_mode']) ||
isset($_POST['openid_mode'])) {
$result = $auth->authenticate(
new Zend_Auth_Adapter_OpenId(@$_POST['openid_identifier']));
if ($result->isValid()) {
$status = "You are logged in as "
. $auth->getIdentity()
. "<br>\n";
} else {
$auth->clearIdentity();
foreach ($result->getMessages() as $message) {
$status .= "$message<br>\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()
. "<br>\n";
}
}
?>
<html><body>
<?php echo htmlspecialchars($status);?>
<form method="post"><fieldset>
<legend>OpenID Login</legend>
<input type="text" name="openid_identifier" value="">
<input type="submit" name="openid_action" value="login">
<input type="submit" name="openid_action" value="logout">
</fieldset></form></body></html>
*/
Puede personalizar el proceso de autenticación OpenID de varias formas.
Puede, por ejemplo, recibir la redirección del servidor OpenID en una página separada,
especificando la "raíz" del sitio web y usando un
Zend_OpenId_Consumer_Storage personalizado o una
Zend_Controller_Response personalizada. También puede usar
la Simple Registration Extension para recuperar información sobre
el usuario del servidor OpenID. Todas estas posibilidades se describen
con más detalle en el capítulo de Zend_OpenId_Consumer.
![[Note]](images/note.png)