Zend_Auth_Adapter_Http.xml 15 KB

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