Zend_Auth_Adapter_Http.xml 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 16855 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.auth.adapter.http">
  5. <title>Adaptador de Autenticación HTTP</title>
  6. <sect2 id="zend.auth.adapter.http.introduction">
  7. <title>Introducción</title>
  8. <para>
  9. <classname>Zend_Auth_Adapter_Http</classname> proporciona una implementación compatible con <ulink
  10. url="http://tools.ietf.org/html/rfc2617">RFC-2617</ulink>, <ulink
  11. url="http://en.wikipedia.org/wiki/Basic_authentication_scheme">Basic</ulink> y <ulink
  12. url="http://en.wikipedia.org/wiki/Digest_access_authentication">Digest</ulink> Autenticación <acronym>HTTP</acronym>. La
  13. autenticación "Digest" es un método de autenticación <acronym>HTTP</acronym> que mejora la autenticación básica proporcionando una manera
  14. de autenticar sin tener que transmitir la contraseña de manera clara en un texto a través de la red. </para>
  15. <para>
  16. <emphasis role="strong">Características Principales:</emphasis>
  17. </para>
  18. <itemizedlist>
  19. <listitem>
  20. <para> Soporta tanto Autenticación "Digest" como Básica. </para>
  21. </listitem>
  22. <listitem>
  23. <para> Establece retos en todos los proyectos soportados, por lo que el cliente puede responder con cualquier
  24. proyecto que soporte. </para>
  25. </listitem>
  26. <listitem>
  27. <para> Soporta autenticación proxy. </para>
  28. </listitem>
  29. <listitem>
  30. <para> Incluye soporte para la autenticación contra archivos de texto y proporciona una interfaz para
  31. autenticar contra otras fuentes, tales como bases de datos. </para>
  32. </listitem>
  33. </itemizedlist>
  34. <para> Hay algunas características notables del <acronym>RFC</acronym>-2617 no implementadas todavía:
  35. </para>
  36. <itemizedlist>
  37. <listitem>
  38. <para> Seguimiento "nonce", que permitiría un gran apoyo, y un aumento de la protección de repetidos ataques.
  39. </para>
  40. </listitem>
  41. <listitem>
  42. <para> Autenticación con comprobación de integridad, o "auth-int". </para>
  43. </listitem>
  44. <listitem>
  45. <para> Cabecera de información de la autenticación <acronym>HTTP</acronym>. </para>
  46. </listitem>
  47. </itemizedlist>
  48. </sect2>
  49. <sect2 id="zend.auth.adapter.design_overview">
  50. <title>Descripción del diseño</title>
  51. <para> Este adaptador consiste en dos sub-componentes, la propia clase autenticación <acronym>HTTP</acronym>, y el llamado "Resolvers". La
  52. clase autenticación <acronym>HTTP</acronym> encapsula la lógica para llevar a cabo tanto la autenticación basica y la "Digest". Utiliza
  53. un Resolver para buscar la identidad de un cliente en los datos almacenados (por defecto, archivos de texto), y
  54. recuperar las credenciales de los datos almacenados. Las credenciales del "Resolved" se comparan con los valores
  55. presentados por el cliente para determinar si la autenticación es satisfactoria. </para>
  56. </sect2>
  57. <sect2 id="zend.auth.adapter.configuration_options">
  58. <title>Opciones de Configuración</title>
  59. <para> La clase <classname>Zend_Auth_Adapter_Http</classname> requiere un array configurado que pasará a su constructor.
  60. Hay varias opciones de configuración disponibles, y algunas son obligatorias:
  61. </para>
  62. <table
  63. id="zend.auth.adapter.configuration_options.table">
  64. <title>Opciones de Configuración</title>
  65. <tgroup cols="3">
  66. <thead>
  67. <row>
  68. <entry>Nombre de Opción</entry>
  69. <entry>Obligatoria</entry>
  70. <entry>Descripción</entry>
  71. </row>
  72. </thead>
  73. <tbody>
  74. <row>
  75. <entry>
  76. <emphasis><property>accept_schemes</property></emphasis>
  77. </entry>
  78. <entry>Si</entry>
  79. <entry> Determina que tareas de autenticación acepta el adaptador del cliente. Debe ser una lista
  80. separada por espacios que contengo <emphasis>'basic'</emphasis> y/o
  81. <emphasis>'digest'</emphasis>. </entry>
  82. </row>
  83. <row>
  84. <entry>
  85. <emphasis><property>realm</property></emphasis>
  86. </entry>
  87. <entry>Si</entry>
  88. <entry> Establece el realm de autenticación; usernames debe ser único dentro de un determinado realm.
  89. </entry>
  90. </row>
  91. <row>
  92. <entry>
  93. <emphasis><property>digest_domains</property></emphasis>
  94. </entry>
  95. <entry>Si, cuando <methodname>'accept_schemes'</methodname> contiene
  96. <emphasis>'digest'</emphasis></entry>
  97. <entry> Lista de URIs separadas por espacios para las cuales la misma información de autenticación es
  98. válida. No es necesario que todas las URIs apunten al mismo oservidor. </entry>
  99. </row>
  100. <row>
  101. <entry>
  102. <emphasis><property>nonce_timeout</property></emphasis>
  103. </entry>
  104. <entry>Si, cuando <methodname>'accept_schemes'</methodname> contiene
  105. <emphasis>'digest'</emphasis></entry>
  106. <entry> Establece el número de segundos para los cuales el "nonce" es válido. Ver notas de abajo.
  107. </entry>
  108. </row>
  109. <row>
  110. <entry><emphasis><property>proxy_auth</property></emphasis></entry>
  111. <entry>No</entry>
  112. <entry> Deshabilitado por defecto. Permite llevar a cabo la autenticación del Proxy, en lugar de la
  113. autenticación normal del servidor. </entry>
  114. </row>
  115. </tbody>
  116. </tgroup>
  117. </table>
  118. <note>
  119. <para> La implementación actual del <property>nonce_timeout</property> tiene algunos efectos colaterales
  120. interesantes. Este ajuste es supuesto para determinar la vida util válida para un determinado "nonce", o de manera
  121. efectiva el tiempo que una información de autenticación del cliente es aceptada. Actualmente, si se establece en
  122. 3600 (por ejemplo), hará que el adaptador indique al cliente las nuevas credenciales cada hora, a la hora en
  123. punto. </para>
  124. </note>
  125. </sect2>
  126. <sect2 id="zend.auth.adapter.http.resolvers">
  127. <title>Resolvers</title>
  128. <para> El trabajo del "Resolver" es tener un username y un realm, y devolver algún valor de tipo credencial. La
  129. autenticación básica espera recibir la versión codificada en Base64 de la contraseña del usuario. La autenticación
  130. "Digest" espera recibir un hash del username del usuario, un realm, y su contraseña (separados por coma). Actualmente,
  131. sólo se admite el algoritmo de hash <acronym>MD5</acronym>. </para>
  132. <para>
  133. <classname>Zend_Auth_Adapter_Http</classname> se basa en la implementación de objetos
  134. <classname>Zend_Auth_Adapter_Http_Resolver_Interface</classname>. Un archivo de texto de la clase "Resolve" se
  135. incluye con este adaptador, pero cualquier otro tipo de "resolver" puede ser creado simplemente implementando la
  136. interfaz del "resolver". </para>
  137. <sect3 id="zend.auth.adapter.http.resolvers.file">
  138. <title>Archivo Resolver</title>
  139. <para> El archivo "resolver" es una clase muy simple. Tiene una única propiedad que especifique un nombre de archivo,
  140. que también puede ser pasado al constructor. Su método <methodname>resolve()</methodname> recorre el archivo de
  141. texto, buscando una linea con el correspondiente username y realm. El formato del archivo de texto es similar a
  142. los archivos htpasswd de Apache: <programlisting><![CDATA[
  143. <username>:<realm>:<credentials>\n
  144. ]]></programlisting> Cada linea consta de tres campos -username, realm, y credenciales - cada uno separados por dos puntos. El
  145. campo credenciales es opaco al archivo "resolver"; simplemente devuelve el valor tal como és al llamador. Por lo
  146. tanto, este formato de archivo sirve tanto de autenticación básica como "Digest". En la autenticación básica, el
  147. campo credenciales debe ser escrito en texto claro. En la autenticación "Digest", debería ser en hash <acronym>MD5</acronym> descrito
  148. anteriormente. </para>
  149. <para> Hay dos formas igualmente fácil de crear un archivo de "resolver":
  150. </para>
  151. <programlisting language="php"><![CDATA[
  152. $path = 'files/passwd.txt';
  153. $resolver = new Zend_Auth_Adapter_Http_Resolver_File($path);
  154. ]]></programlisting>
  155. <para>
  156. o
  157. </para>
  158. <programlisting language="php"><![CDATA[
  159. $path = 'files/passwd.txt';
  160. $resolver = new Zend_Auth_Adapter_Http_Resolver_File();
  161. $resolver->setFile($path);
  162. ]]></programlisting> Si la ruta está vacía o no se puede leer, se lanza una excepción.
  163. </sect3>
  164. </sect2>
  165. <sect2 id="zend.auth.adapter.http.basic_usage">
  166. <title>Uso Básico</title>
  167. <para> En primer lugar, establecemos un array con los valores de configuración obligatorios:
  168. </para>
  169. <programlisting language="php"><![CDATA[
  170. $config = array(
  171. 'accept_schemes' => 'basic digest',
  172. 'realm' => 'My Web Site',
  173. 'digest_domains' => '/members_only /my_account',
  174. 'nonce_timeout' => 3600,
  175. );
  176. ]]></programlisting>
  177. <para>
  178. Este array hará que el adaptador acepte la autenticación básica o "Digest", y requerirá un acceso autenticado
  179. a todas las áreas del sitio en <filename>/members_only</filename> y <filename>/my_account</filename>. El valor
  180. realm es normalmente mostrado por el navegador en el cuadro de dialogo contraseña. El
  181. <property>nonce_timeout</property>, por supuesto, se comporta como se ha descrito anteriormente. </para>
  182. <para> A continuación, creamos el objeto Zend_Auth_Adapter_Http:
  183. </para>
  184. <programlisting language="php"><![CDATA[
  185. $adapter = new Zend_Auth_Adapter_Http($config);
  186. ]]></programlisting>
  187. <para> Ya que estamos soportando tanto la autenticación básica como la "Digest", necesitamos dos objetos diferentes
  188. resolver. Tenga en cuenta que esto podría ser facilmente dos clases diferentes:
  189. </para>
  190. <programlisting language="php"><![CDATA[
  191. $basicResolver = new Zend_Auth_Adapter_Http_Resolver_File();
  192. $basicResolver->setFile('files/basicPasswd.txt');
  193. $digestResolver = new Zend_Auth_Adapter_Http_Resolver_File();
  194. $digestResolver->setFile('files/digestPasswd.txt');
  195. $adapter->setBasicResolver($basicResolver);
  196. $adapter->setDigestResolver($digestResolver);
  197. ]]></programlisting>
  198. <para> Por último, realizamos la autenticación. El adaptador necesita una referencia a ambos objetos solicitud y respuesta
  199. para hacer su trabajo:
  200. </para>
  201. <programlisting language="php"><![CDATA[
  202. assert($request instanceof Zend_Controller_Request_Http);
  203. assert($response instanceof Zend_Controller_Response_Http);
  204. $adapter->setRequest($request);
  205. $adapter->setResponse($response);
  206. $result = $adapter->authenticate();
  207. if (!$result->isValid()) {
  208. // Bad userame/password, or canceled password prompt
  209. }
  210. ]]></programlisting>
  211. </sect2>
  212. </sect1>