Adaptador de Autenticación HTTP

Introducción

Zend\Auth_Adapter\Http proporciona una implementación compatible con RFC-2617, Basic y Digest Autenticación HTTP. La autenticación “Digest” es un método de autenticación HTTP que mejora la autenticación básica proporcionando una manera de autenticar sin tener que transmitir la contraseña de manera clara en un texto a través de la red.

Características Principales:

  • Soporta tanto Autenticación “Digest” como Básica.
  • Establece retos en todos los proyectos soportados, por lo que el cliente puede responder con cualquier proyecto que soporte.
  • Soporta autenticación proxy.
  • Incluye soporte para la autenticación contra archivos de texto y proporciona una interfaz para autenticar contra otras fuentes, tales como bases de datos.

Hay algunas características notables del RFC-2617 no implementadas todavía:

  • Seguimiento “nonce”, que permitiría un gran apoyo, y un aumento de la protección de repetidos ataques.
  • Autenticación con comprobación de integridad, o “auth-int”.
  • Cabecera de información de la autenticación HTTP.

Descripción del diseño

Este adaptador consiste en dos sub-componentes, la propia clase autenticación HTTP, y el llamado “Resolvers”. La clase autenticación HTTP encapsula la lógica para llevar a cabo tanto la autenticación basica y la “Digest”. Utiliza un Resolver para buscar la identidad de un cliente en los datos almacenados (por defecto, archivos de texto), y recuperar las credenciales de los datos almacenados. Las credenciales del “Resolved” se comparan con los valores presentados por el cliente para determinar si la autenticación es satisfactoria.

Opciones de Configuración

La clase Zend\Auth_Adapter\Http requiere un array configurado que pasará a su constructor. Hay varias opciones de configuración disponibles, y algunas son obligatorias:

Opciones de Configuración
Nombre de Opción Obligatoria Descripción
accept_schemes Si Determina que tareas de autenticación acepta el adaptador del cliente. Debe ser una lista separada por espacios que contengo ‘basic’ y/o ‘digest’ .
realm Si Establece el realm de autenticación; usernames debe ser único dentro de un determinado realm.
digest_domains Si, cuando accept_schemes contiene ‘digest’ Lista de URI s separadas por espacios para las cuales la misma información de autenticación es válida. No es necesario que todas las URI s apunten al mismo servidor.
nonce_timeout Si, cuando accept_schemes contiene ‘digest’ Establece el número de segundos para los cuales el “nonce” es válido. Ver notas de abajo.
proxy_auth No Deshabilitado por defecto. Permite llevar a cabo la autenticación del Proxy, en lugar de la autenticación normal del servidor.

Nota

La implementación actual del nonce_timeout tiene algunos efectos colaterales interesantes. Este ajuste es supuesto para determinar la vida util válida para un determinado “nonce”, o de manera efectiva el tiempo que una información de autenticación del cliente es aceptada. Actualmente, si se establece en 3600 (por ejemplo), hará que el adaptador indique al cliente las nuevas credenciales cada hora, a la hora en punto.

Resolvers

El trabajo del “Resolver” es tener un username y un realm, y devolver algún valor de tipo credencial. La autenticación básica espera recibir la versión codificada en Base64 de la contraseña del usuario. La autenticación “Digest” espera recibir un hash del username del usuario, un realm, y su contraseña (separados por coma). Actualmente, sólo se admite el algoritmo de hash MD5.

Zend\Auth_Adapter\Http se basa en la implementación de objetos Zend\Auth\Adapter\Http\Resolver\Interface. Un archivo de texto de la clase “Resolve” se incluye con este adaptador, pero cualquier otro tipo de “resolver” puede ser creado simplemente implementando la interfaz del “resolver”.

Archivo Resolver

El archivo “resolver” es una clase muy simple. Tiene una única propiedad que especifique un nombre de archivo, que también puede ser pasado al constructor. Su método resolve() recorre el archivo de texto, buscando una linea con el correspondiente username y realm. El formato del archivo de texto es similar a los archivos htpasswd de Apache:

1
<username>:<realm>:<credentials>\n

Cada linea consta de tres campos -username, realm, y credenciales - cada uno separados por dos puntos. El campo credenciales es opaco al archivo “resolver”; simplemente devuelve el valor tal como és al llamador. Por lo tanto, este formato de archivo sirve tanto de autenticación básica como “Digest”. En la autenticación básica, el campo credenciales debe ser escrito en texto claro. En la autenticación “Digest”, debería ser en hash MD5 descrito anteriormente.

Hay dos formas igualmente fácil de crear un archivo de “resolver”:

1
2
$path     = 'files/passwd.txt';
$resolver = new Zend\Auth\Adapter\Http\Resolver\File($path);

o

1
2
3
$path     = 'files/passwd.txt';
$resolver = new Zend\Auth\Adapter\Http\Resolver\File();
$resolver->setFile($path);

Si la ruta está vacía o no se puede leer, se lanza una excepción.

Uso Básico

En primer lugar, establecemos un array con los valores de configuración obligatorios:

1
2
3
4
5
6
$config = array(
    'accept_schemes' => 'basic digest',
    'realm'          => 'My Web Site',
    'digest_domains' => '/members_only /my_account',
    'nonce_timeout'  => 3600,
);

Este array hará que el adaptador acepte la autenticación básica o “Digest”, y requerirá un acceso autenticado a todas las áreas del sitio en /members_only y /my_account. El valor realm es normalmente mostrado por el navegador en el cuadro de dialogo contraseña. El nonce_timeout, por supuesto, se comporta como se ha descrito anteriormente.

A continuación, creamos el objeto ZendAuth_AdapterHttp:

1
$adapter = new Zend\Auth_Adapter\Http($config);

Ya que estamos soportando tanto la autenticación básica como la “Digest”, necesitamos dos objetos diferentes resolver. Tenga en cuenta que esto podría ser facilmente dos clases diferentes:

1
2
3
4
5
6
7
8
$basicResolver = new Zend\Auth\Adapter\Http\Resolver\File();
$basicResolver->setFile('files/basicPasswd.txt');

$digestResolver = new Zend\Auth\Adapter\Http\Resolver\File();
$digestResolver->setFile('files/digestPasswd.txt');

$adapter->setBasicResolver($basicResolver);
$adapter->setDigestResolver($digestResolver);

Por último, realizamos la autenticación. El adaptador necesita una referencia a ambos objetos solicitud y respuesta para hacer su trabajo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
assert($request instanceof Zend\Controller_Request\Http);
assert($response instanceof Zend\Controller_Response\Http);

$adapter->setRequest($request);
$adapter->setResponse($response);

$result = $adapter->authenticate();
if (!$result->isValid()) {
    // Bad userame/password, or canceled password prompt
}