Diferencia entre revisiones de «Plantilla:PHP/Autentificacion»

De WikiEducator
Saltar a: navegación, buscar
(Autentificación por el servidor web)
 
(45 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
{{TEP}}
 
{{__TOC__}}
 
 
===Qué es autentificarse===
 
===Qué es autentificarse===
*Por autentificarse vamos a entender un mecanismo por el cual el servidor web puede estar relativamente confiado en que está siendo consultado por una determinada máquina y/o persona.
+
<div id=parrafo>
*Por ejemplo podemos visitar esta página y ver diferentes modos en los que piden autentificarse
+
*Por autentificarse vamos a entender el mecanismo por el cual el servidor web puede estar '''relativamente''' confiado en que está siendo consultado por una determinada máquina y/o persona.
 +
*Como ejemplos de modos de autentificación, podemos visitar esta página y ver diferentes modos en los que piden autentificarse.
 
  https://www.tractis.com/login
 
  https://www.tractis.com/login
*Modos de autentificarse
+
====Modos de autentificarse====
#Contraseña y usuario
+
#Contraseña y usuario.
##Almacenar el usuario en sesión (Lo veremos más adelante)
+
##Almacenar el usuario en sesión (Lo veremos más adelante). Lo podríamos considerar el método tradicional y válido para la mayoría de aplicaciones que pudiéramos realizar.
#Dni digital
+
##Necesitamos una base de datos dónde almacenar los datos de usuario y contraseña
#Certificados digitales de usuario
+
#Dni digital.
#Autentificación basada en Tokens
+
#Certificados digitales de usuario.
##Usando el protocolo Auth 2.0  (Lo veremos en app híbridas usando el protocolo Auth 2.0)
+
#Autentificación basada en Tokens.
 +
##Usando el protocolo Auth 2.0  (Lo veremos en app híbridas usando el protocolo Auth 2.0).
 
##Usando JSON Web Token (JWT)  http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html
 
##Usando JSON Web Token (JWT)  http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html
{{MRM_Recursos de la Web|Title=Sistema de autentificación por token usando usuarios de redes sociales  o de la web|
+
#Autentificación en dos pasos
 +
## En este método de autentificar, el usuario, además de acreditarse con sus credenciales (usuario y password), se ha  verificar con otro método que algún tipo de identificador que el sistema que le ha de autentificar le va a enviar.
 +
##'''''SMS OTP''''' (On Time Password) donde el sistema envía un sms  a su teléfono móvil que el sistema ha de conocer
 +
##Envío de un códiog al  correo electrónico. Usado por muchos sistemas como git.
 +
##Envío de una URL al sms o al correo electrónico para acceder al sistema
 +
## Un siste
 +
#Autentificación basada en factores biométricos.
 +
##Por ejemplo huella digital o lectura del iris del ojo. Muy utilizada en dispositivos móviles y acceso a espacios reservados.
 +
{{MRM_Recursos de la Web|Title=Delegando la autentifiación basada en token|
 
1.Autentificarse a través de la cuenta de Twiter  
 
1.Autentificarse a través de la cuenta de Twiter  
http://www.maestrosdelweb.com/twitter-autenticacion-oauth-api-login/
+
;https://help.twitter.com/es/managing-your-account/two-factor-authentication
 
2.Autentificarse a través de la cuenta de Facebook
 
2.Autentificarse a través de la cuenta de Facebook
http://www.elwebmaster.com/articulos/autenticacion-de-usuarios-con-facebook-connect-y-google-friend-connect
+
;https://www.xataka.com/basics/como-usar-google-authenticator-para-iniciar-sesion-facebook-mejorar-seguridad-tu-cuenta
 
3.Autentificarse a través de la cuenta de Google  
 
3.Autentificarse a través de la cuenta de Google  
http://www.ladrupalera.com/drupal/desarrollo/javascript/como-usar-una-api-de-google-con-autenticacion-traves-de-oauth2
+
;https://support.google.com/accounts/answer/1066447
 
}}
 
}}
 
*Seguro que hay mas sistemas y seguro que  muy interesantes, pero estos son los que aquí veremos.
 
*Seguro que hay mas sistemas y seguro que  muy interesantes, pero estos son los que aquí veremos.
*Nosotros en este tema usaremos el modo de contraseña y usuario. En dos temas posteriores, cuando veamos servicios web usaremos otro sistema como google, igualmente se podría usar la cuenta de facebook o twiter para identificarte, en la realación anterior hay algún enlace por si es de tu interés
+
*Nosotros en este tema usaremos el modo de '''''contraseña y usuario'''''. En dos temas posteriores, cuando veamos servicios web usaremos otro sistema como '''google'''; igualmente se podría usar la cuenta de '''facebook''' o '''twiter''' para identificarte, en la relación anterior hay algún enlace por si es de tu interés.<br />
*La responsabilidad de exigir una clave de acceso puede recaer sobre el servidor web con los módulos de seguridad
+
La responsabilidad de exigir una clave de acceso puede recaer sobre el '''''servidor web''''' (en nuestro caso ''apache''), con los módulos de seguridad.
*En este caso restringimos el acceso a la página o sitio web
+
*En este caso restringimos el acceso a la página o sitio web.
*Otra opción habitual es tener un sitio con cierto contendo y en el sitio dar la posibilidad de identificarse / registrarse.
+
*Otra opción habitual es tener un sitio con cierto contenido y en el sitio dar la posibilidad de identificarse / registrarse.
*A usuarios identificados se les ofrece otro contendio diferente.
+
*A usuarios identificados se les ofrece otro contenido diferente.
Respecto a estos conceptos vamos a trabajar este tema que es el primero de tres aspectos del tema 4
+
Respecto a estos conceptos vamos a trabajar este tema que es el primero de tres aspectos de este tema.<br />
  
 
===Protocolo http vs https===
 
===Protocolo http vs https===
*Este es un concepto importante, diferenciar en contenidos que se envíen de forma segura (usar cifrado en el envío que es lo que se hace con https) y en el hecho que para acceder a un sitio tengan un nivel de seguridad que implique que de alguna manera te tengas que autentificar.
+
Este es un concepto importante, diferenciar en contenidos que se envíen de forma segura (usar cifrado en el envío que es lo que se hace con https) y en el hecho que para acceder a un sitio tengan un nivel de seguridad que implique que de alguna manera te tengas que autentificar.<br />
*La seguridad del envío de datos es otro aspecto diferente del tema de la autentificación
+
La seguridad del envío de datos es otro aspecto diferente del tema de la autentificación.<br />
*En seguridad entre otros aspectos tenemos  
+
En seguridad entre otros aspectos tenemos: <br />
 
#'''''La autentificación''''' mecanismos por los cuales podemos confiar en que quien se ha identificado es conocido para el sistema.
 
#'''''La autentificación''''' mecanismos por los cuales podemos confiar en que quien se ha identificado es conocido para el sistema.
 
#'''''La confidencialidad''''' son mecanismos con los que podemos confiar en que nadie puede ver el contenidio de la información ni modificarla durante  la transmisión.
 
#'''''La confidencialidad''''' son mecanismos con los que podemos confiar en que nadie puede ver el contenidio de la información ni modificarla durante  la transmisión.
[[Imagen:HttpVshttps.jpg|400px]]
+
[[Imagen:HttpVshttps.jpg|center|400px]]<br />
*Ambos mecanismos debería de trabajar conjuntamente. Por ejemplo si yo envío una contraseña para identificarse, pero con un '''sniffer''', alguien la puede capturar y ver en claro, no conseguimos nada de seguridad .
+
Ambos mecanismos debería de trabajar conjuntamente. Por ejemplo si yo envío una contraseña para identificarse, pero con un '''sniffer''', alguien la puede capturar y ver en claro, no conseguimos nada de seguridad.<br />
 
*Para la transmisión segura se emplea el protocolo https.
 
*Para la transmisión segura se emplea el protocolo https.
 
*Este tema se estudia en el módulo de despliegue de aplicaciones web.
 
*Este tema se estudia en el módulo de despliegue de aplicaciones web.
*Nosotros usaremos http sin cifrar, pero se insiste en que no es segura la transmisión, pues podría ser objetivo de espía informático.
+
{{Tip|Nosotros usaremos http sin cifrar, pero se insiste en que no es segura la transmisión, pues podría ser objetivo de espía informático.}}
  
 
===Autentificación por el servidor web===
 
===Autentificación por el servidor web===
 +
https://httpd.apache.org/docs/2.4/howto/auth.html
 +
 
*Es el propio servidor '''''http''''' quien nos ofrece este método de autentificación.
 
*Es el propio servidor '''''http''''' quien nos ofrece este método de autentificación.
*Este tema se ve dentro del módulo de despliegue de aplicaciones web, no obstante aquí nos va a interesar, cómo podemos hacer que sea el servidor el que solicite las credenciales y recoja los datos aportados, y cómo desde php podemos ver esos valores o datos y gestionarlos en nuestro programa.
+
*Este tema es un tema de sistemas, y se estudia en módulos correspondintes a despliegue o a la red y sus servicios. En este caso el servicio web.
*Recordamos el mecanismo de autentificación que usa '''''apache'''''.
+
De cualquier forma como desarrolladores, nos va a interesar y lo vamos a utilizar de dos formas:
 +
<br />
 +
{{MRM_Puntos clave|
 +
*'''''1.-'''''Cómo podemos hacer que sea el servidor el que solicite las credenciales, recoja los datos aportados y verifique contra un fichero previamente generado con identificaciones si cumple o no los criterios establecidos
 +
*'''''2.-''''' Cómo podemos hacer para que php recoja los datos de un formulario que va a entregar directamente apache.
 +
}}
 +
*Para estos cometidos, hemos de configurar el servidor. Es importante entender cómo es la configuración de apache, analicemos y comentemos la siguiente imagen:
 +
[[Archivo:configuracion.png|center]]
 +
 
 +
*Como vemos, podemos aportar parámetros de configuración de apache para un proyecto concreto incluyendo las directivas necesarias en un fichero llamado '''''.htaccess'''''.
 +
*Para hacer esto, ese directorio ha de permitir su lectura. Esto implica que ese directorio (o uno del que descienda), tiene que tener activa la directiva '''''AllowOverride''''', en el fichero de configuración de apache
 +
*Por lo tanto el primer paso para realizar esta configuración es establecer dicha directiva
 +
{{MRM_Actividad|Title=Tarea 1|
 +
Verifica Que tienes dicha directiva y confirma que tienes claro en qué directorio hay que establecerla
 +
{{plegable|hide|Acción realizada|
 +
;Fichero
 +
/etc/apache2/apache.conf
 +
;Directiva o acción
 +
*Si lo ponemos de forma general
 +
<source lang=bash>
 +
<Directory /var/www/>
 +
        AllowOverride all
 +
</Directory>
 +
 
 +
</source>
 +
 
 +
*Si lo queremos establecer solo para un directorio concreto
 +
<source lang=bash>
 +
<Directory /var/www/proyectox>
 +
        AllowOverride all
 +
</Directory>
 +
</source>
 +
*Con este valor, le estamos indicando a apache que antes de entregar el recurso, mira a ver si hay algún fichero '''''.htaccess''''' en ese directory y tenga en cuenta su contenido. El valor de esta directiva establece qué se va a leer de .htaccess
 +
{{MRM_Web|Title=AllowOverride y .htaccess|
 +
https://httpd.apache.org/docs/2.4/es/howto/htaccess.html
 +
}}
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
}}
 +
}}
  
#Definir los usuarios con acceso permitido  
+
#Definir los usuarios con acceso permitido.
 
#Se puede indicar a qué recursos tiene acceso el usuario en concreto (me refiero a qué páginas).
 
#Se puede indicar a qué recursos tiene acceso el usuario en concreto (me refiero a qué páginas).
#Generar en cabecera '''http''' un código '''''http  401''''' que es un código de acceso restringido. Este código hace que el usuario reciba un formulario para aportar sus credendiales
+
#Generar en cabecera '''http''' un código '''''http  401''''' que es un código de acceso restringido. ##Este código hace que el usuario reciba un formulario para aportar sus credendiales.
#El navegador al recibir ese código solicitando credenciales  
+
#El navegador al recibir ese código solicita credenciales.
#El servidor recibe estas credenciales y las almacena en sus variables superglobales para futuras solicitudes
+
#El servidor recibe estas credenciales y las almacena en sus variables superglobales para futuras solicitudes.
[[imagen:autentificacionServidor.php]]
+
A continuación analizaremos cada uno de estos pasos
 
====Crear la lista de usuarios====
 
====Crear la lista de usuarios====
 
[[Imagen:listaUsuarios.png]]
 
[[Imagen:listaUsuarios.png]]
 
*Usamos la herramienta '''''htpasswd''''' para crear un fichero con los usuarios y sus contraseñas
 
*Usamos la herramienta '''''htpasswd''''' para crear un fichero con los usuarios y sus contraseñas
 
  http://httpd.apache.org/docs/2.4/es/howto/auth.html
 
  http://httpd.apache.org/docs/2.4/es/howto/auth.html
*En caso de no tener la herramienta instalada debemos hacer la instalación de las herramientas o utilidades de apache escribiendo
+
*En caso de no tener la herramienta instalada debemos hacer la instalación de las herramientas o utilidades de apache escribiendo:
 
  sudo apt-get install apache2-utils
 
  sudo apt-get install apache2-utils
 
*Este comando tiene una serie de opciones que podemos ver en línea de comandos sin mas que escribir su nombre.
 
*Este comando tiene una serie de opciones que podemos ver en línea de comandos sin mas que escribir su nombre.
Línea 77: Línea 131:
 
The SHA algorithm does not use a salt and is less secure than the MD5 algorithm.
 
The SHA algorithm does not use a salt and is less secure than the MD5 algorithm.
 
</source>
 
</source>
 +
 
*Es importante la opción '''''-c''''' para crear el fichero. Recuerda usarla sólo la primera vez; cuando la usas se crea el fichero, y si ya existiera se elimina el contenido del fichero  y se crea de nuevo.
 
*Es importante la opción '''''-c''''' para crear el fichero. Recuerda usarla sólo la primera vez; cuando la usas se crea el fichero, y si ya existiera se elimina el contenido del fichero  y se crea de nuevo.
 
*Para incorporar nuevos usuarios se escribe sin opción y se añade el nombre de los usuario
 
*Para incorporar nuevos usuarios se escribe sin opción y se añade el nombre de los usuario
 
*Por seguridad es importante añadir el fichero en una ubicación fuera del directorio '''''documentRoot'''''  del servidor web.
 
*Por seguridad es importante añadir el fichero en una ubicación fuera del directorio '''''documentRoot'''''  del servidor web.
 
+
{{Plegable|hide|Ficheros de usuarios|
{{MRM_Actividad|
+
{{Actividad|Title=Crea un fichero de usuarios|
 +
====Ficheros de usuarios====
 
*crea un fichero llamado '''''misUsuarios''''' y añade 3 usuarios maria/maria nieves/nieves sara/sara. Se indica usuario/password
 
*crea un fichero llamado '''''misUsuarios''''' y añade 3 usuarios maria/maria nieves/nieves sara/sara. Se indica usuario/password
*Posteriormente visualiza el contenido del fichero
+
*Posteriormente visualiza el contenido del fichero.
*Observa cómo la pass aparece cifrada
+
*Observa cómo la pass aparece cifrada.
 
;Modo de actuación
 
;Modo de actuación
 
1.- Primero nos ubicamos en el directorio donde queramos añadir o crear el fichero
 
1.- Primero nos ubicamos en el directorio donde queramos añadir o crear el fichero
 
  cd /home/MiUsuario
 
  cd /home/MiUsuario
  '''''MiUsuario''''' es vuestro propio directorio
+
  '''''MiUsuario''''' es vuestro propio directorio en home.
2.-Ahora creamos un directorio para guardar esta información y nos movemos en él
+
2.-Ahora creamos un directorio para guardar esta información y nos movemos en él.
 
  mkdir usuarios
 
  mkdir usuarios
 
  cd usuarios
 
  cd usuarios
3.-Una vez correctamente ubicados generamos el fichero de las password con la herramienta '''''htpasswd'''''
+
3.-Una vez correctamente ubicados generamos el fichero de las password con la herramienta '''''htpasswd'''''. En este caso crearemos 3 usuarios: (maria, nieves y lourdes).
 
  La primera vez con opción '''''-c''''' para crear el fichero
 
  La primera vez con opción '''''-c''''' para crear el fichero
 
   htpasswd -c misUsuarios maria
 
   htpasswd -c misUsuarios maria
 
   htpasswd  misUsuarios nieves
 
   htpasswd  misUsuarios nieves
   htpasswd misUsuarios nieves
+
   htpasswd misUsuarios lourdes
 +
}}
 
}}
 
}}
  
 
====Indicar los recursos restringidos : '''.htaccess'''====
 
====Indicar los recursos restringidos : '''.htaccess'''====
*Para este cometido, apache nos permite usar el famoso fichero '''''.htaccess''''' que a continuación vamos a explicar.
+
*Para este cometido, '''apache''' nos permite usar el famoso fichero '''''.htaccess''''' que a continuación vamos a explicar.
 
*Para habilitar el uso de este fichero debemos indicarle al servidor web que vamos a utilizarlo. Esto se especifica en la directiva '''''AllowOverride'''''
 
*Para habilitar el uso de este fichero debemos indicarle al servidor web que vamos a utilizarlo. Esto se especifica en la directiva '''''AllowOverride'''''
 
*Para más información ver  
 
*Para más información ver  
Línea 109: Línea 166:
 
*Una vez que hemos hecho esto, cada vez que vaya a coger un fichero de un determinado directorio, antes de entregarlo, verificará que si existe un fichero '''''.htaccess''''' en ese directorio, en cuyo caso pedirá credenciales.
 
*Una vez que hemos hecho esto, cada vez que vaya a coger un fichero de un determinado directorio, antes de entregarlo, verificará que si existe un fichero '''''.htaccess''''' en ese directorio, en cuyo caso pedirá credenciales.
 
*Para indicar los recursos restringidos usaremos las siguientes directivas (Este será el contenido del fichero .htaccess
 
*Para indicar los recursos restringidos usaremos las siguientes directivas (Este será el contenido del fichero .htaccess
*'''''AuthName'''''      Nombre de dominio de la authentificación
+
*'''''AuthName'''''      Nombre de dominio de la authentificación.
*'''''AuthType'''''      Tipo de autentificación, pudiendo ser  '''Basic''' y más segura '''Dijest'''
+
*'''''AuthType'''''      Tipo de autentificación, pudiendo ser  '''Basic''' y más segura '''Digest''', donde se ustilizan una cadena 'realm' y  dos valores únicos generados por el servidor con por ejemplo <source lang=php>md5(uniqid())</source> llamados '''''nonce''''' y '''''opaque'''''.
*'''''AuthUserFile'''''  Ruta del fichero de los usuarios con permiso'''''
+
*'''''AuthUserFile'''''  Ruta del fichero de los usuarios con permiso'''''.
*'''''Require'''''        '''''valid-user''''' o usuarios concretos de la lista que sí que tendrán acceso al recursos si se acreditan correctamente.
+
*'''''AuthGroupFile'''''  Ruta del fichero de los usuarios con permiso'''''.
+
*'''''Require'''''        '''''valid-user''''' o usuarios concretos de la lista que sí que tendrán acceso al recursos si se acreditan correctamente. '''''group''''' o grupos concretos a validar
{{MRM_Actividad|Title= Accesos restringidos, (resuelto en actividades)
+
  [[Imagen:htaccess.png]]
Crea un sencillo sitio web que me redirija a 4 páginas:
+
<br />
*'''''Información General''''' :  Tendrá acceso todo el mundo
+
{{MRM_Actividad|Title= Accesos restringidos|
*'''''Información restirngida''''': Sólo tendŕan acceso los usuaarios creados en el fichero misUsuarios
+
[[Usuario:ManuelRomero/ProgramacionWeb/php/Aut_Ses_Coo/ejercicios#Accesos Restringidos|Accesos Restringidos]]
*'''''Información Sara''''' : Tendrá acceso solo el usuario sara
+
*'''''Información de grupo''''' : Tendrá acceso los usuarios 3 usuarios de los 5 creados (sara alicia y paula)
+
{{Tip|Ten en cuenta los propietarios de la carpeta (el grupo que pertenezca a www-data}}
+
 
}}
 
}}
 +
*En el caso de querer crear un grupo se haría de la siguiente manera
 +
*Primero creamos un grupo en un fichero
 +
grupo1: user1 user2 user3
 +
*guardamos esta información en un fichero, por ejemplo
 +
/home/manuel/credenciales/grupoAdmin
 +
*Por supuesto estos usuarios deben de ser incluidos en el fichero de password, con el comando '''''htpasswd'''''
 +
*Y ahora especificamos el grupo en las restricciones de acceso en el fichero .htaccess con la directiva '''''AuthUserFile''''' para especificar el grupo y en la directiva R'''''Require'''''' especificamos '''group''' y '''nombre de grupo'''.
 +
<source lang=bash>
 +
AuthType Basic
 +
AuthName Restricción de grupos
 +
AuthUserFile /home/manuel/credenciales/passwords
 +
AuthGroupFile /home/manuel/credenciales/grupoAdmin
 +
Require group
 +
</source>
 +
{{Tip| Recordar que el módulo de grupo debe de estar habilitado
 +
<source lang=bash>
 +
a2enmod authz_groupfile
 +
</source>
 +
}}
 +
*En este caso la validación la hace el '''''servidor apache'''''. Es decir, si se ejecuta el fichero solicitado, es porque '''apache''' ya ha validado.
 +
*Si se validó previamente, ''apache'' utiliza cookies de sesión, que desde php no podemos modificar ni borrar, por lo que si volvemos a entrar en la página ya no nos pedirá validación.
 +
*Observa el ejemplo anterior en el cual se ha creado una página para eliminar el usuario dejando solo acceso a un usuario que no existe y así forzamos que se borre el anteriormente registrado.
 +
 
===PHP accediendo a información http===
 
===PHP accediendo a información http===
*Ahora viene la parte que realmente nos interesa a nosotros/as, qué es usar esto dentro de nuestro código '''''php'''''.
+
*Ahora viene la parte que realmente nos interesa a nosotros/as, qué es usar esto, dentro de nuestro código '''''php'''''.
 +
*En este caso no vamos a necesitar el fichero .htaccess, ya que no queremos que '''''apache''''' realice la validación, queremos hacerla dentro de nuestro script.
 
*Desde el código de php podemos acceder a la información facilitada por el servidor.
 
*Desde el código de php podemos acceder a la información facilitada por el servidor.
*La matriz asociativa variable superglobal '''''$_SERVER''''' contiene  esta información
+
*Tenemos que conseguir hacer que si se validó correctamente ejecutemos el script completo y si no se ha validado que se le entregue un formulario de validación que entrega apache cuando queremos validar.
*Concretamente los índices
+
*Para ello vamos a usar la función '''''header''''' para crear cabeceras  y entregar un página para autentificarse en caso de que no se haya autentificado (el formulario), y si se ha identificado cogeremos las credenciales facilitadas y las verificaremos.
 +
*Para recoger las credenciales del formulario, accederemos a la matriz asociativa '''''$_SERVER'''''
 +
{{MRM_Actividad|Title=Accediendo a las credenciales del formulario que ofrece apache|
 +
*La matriz asociativa variable superglobal '''''$_SERVER''''' contiene  esta información.
 +
Concretamente los índices:
 
#'''''PHP_AUTH_USER''''' Es el nombre del usuario  
 
#'''''PHP_AUTH_USER''''' Es el nombre del usuario  
 
#'''''PHP_AUTH_PW''''' Es la password del usuario
 
#'''''PHP_AUTH_PW''''' Es la password del usuario
 
#'''''AUTH_TYPE''''' Es el tipo de seguridad utilizado  
 
#'''''AUTH_TYPE''''' Es el tipo de seguridad utilizado  
{{MRM_Actividad|
+
{{MRM_Actividad|Title=PHP accediendo a los datos de identificación|
*Modifica la página restringida para ver el usuario y password así como el método usado de autentifiacion
+
[[Usuario:ManuelRomero/ProgramacionWeb/php/Aut_Ses_Coo/ejercicios#Leer con php datos de la autentificación|Php accediendo a los datos de identificación]]
*El código que habría que añadir
+
<source lang=php>
+
  <?php
+
        echo "te has autentificado como:<br/>";
+
       
+
        echo "Usuario: ". $_SERVER['PHP_AUTH_USER']."<br/>";
+
        echo "Password: ". $_SERVER['PHP_AUTH_PW']."<br/>";
+
        echo "Tipo de autentificacion: ". $_SERVER['AUTH_TYPE'];
+
  ?>
+
</source>
+
 
}}
 
}}
 +
}}
 +
  
====Usar función '''''header''''' para la autentifiación====
+
====Usar función '''''header''''' para la autentificación====
La referencia de la función '''''header''''' Sirve para crear cabeceras de la página solicitada  
+
*La referencia de la función '''''header''''' Sirve para crear cabeceras de la página solicitada  
 
  http://es.php.net/manual/es/function.header.php
 
  http://es.php.net/manual/es/function.header.php
 
Vamos a usarla para unas acciones concretas.
 
Vamos a usarla para unas acciones concretas.
 
;Modificar el texto de error
 
;Modificar el texto de error
En este caso no vamos a usar el fichero '''''.htaccess'''''. Cuando accedemos a una página y no nos hemos identificado aparece un error 401. Nosotros vamos a solicitar una autentifiación '''''tipo basic'''''.
+
En este caso no vamos a usar el fichero '''''.htaccess'''''. Cuando accedemos a una página y no nos hemos identificado aparece un error 401. Nosotros vamos a solicitar una autentifiCación '''''tipo basic'''''.
 
< br/>
 
< br/>
Para ello especificamos la cabecera '''''WWW-Authenticate'''''.Ademas de especificar el modo de autentifación ponemos el mensaje que verá el usuario:
+
Para ello especificamos la cabecera '''''WWW-Authenticate'''''.Ademas de especificar el modo de autentificación ponemos el mensaje que verá el usuario:
 
<source lang=php>
 
<source lang=php>
 
     header('WWW-Authenticate: Basic Realm="Página de acceso restringido. Necesitas credenciales"');
 
     header('WWW-Authenticate: Basic Realm="Página de acceso restringido. Necesitas credenciales"');
 
</source>
 
</source>
Para no mostrar la página solicitada se envía un código 401, lo que provoca que se solicite un usuario y contraseña antes de visualizar el resto de la página. El códgio quedaría:<br />
+
*Para no mostrar la página solicitada se envía un código 401, lo que provoca que se solicite un usuario y contraseña antes de visualizar el resto de la página. El código quedaría:<br />
 
<source lang=php>
 
<source lang=php>
 
     header('HTTP/1.0 401 Unauthorized');
 
     header('HTTP/1.0 401 Unauthorized');
Línea 170: Línea 244:
 
?>
 
?>
 
</source>
 
</source>
Ahora debemos poder especificar cuál va a ser el usuario esperado en esta página. Por ejemplo en la página anterior insertamos un usuario cualquiera y una password cualquiera entraremos ya que no comparamos con ningún valor.
+
*Ahora debemos poder especificar cuál va a ser el usuario esperado en esta página. Por ejemplo en la página anterior insertamos un usuario cualquiera y una password cualquiera entraremos ya que no comparamos con ningún valor.
 
<source lang=php>
 
<source lang=php>
 
<?php
 
<?php
Línea 177: Línea 251:
 
?>
 
?>
 
</source>
 
</source>
=====Verficar el usuario y contraseña=====
+
====Verificar el usuario y contraseña====
Con el siguiente código verificaríamos el usuario y contraseña usando el modo de '''''header'''''
+
Con el siguiente código verificaríamos el usuario y contraseña usando el modo de '''''header'''''.
 
<source lang=php>
 
<source lang=php>
 
<?php
 
<?php
Línea 189: Línea 263:
 
?>
 
?>
 
</source>
 
</source>
Esto nos podría servir, puesto que el código no se envía al cliente, y él nunca podría ver la password, ni el usuario. No obstante, siempre será una opción más segura, y más versátil tener el usuario almacenado en una base de datos que ya veremos más adelante cuando veamos bases de datos.
+
*Esto nos podría servir, puesto que el código no se envía al cliente, y él nunca podría ver la password, ni el usuario. No obstante, siempre será una opción más segura, y más versátil tener el usuario almacenado en una base de datos que ya veremos más adelante cuando veamos bases de datos.
{{MRM_Actividad|
+
</div><!-- End div id parrafo -->
Haz un programa en el que controlemos que el usuario con tu nombre y la misma password pueda acceder
+
Solo se dejarán 3 intentos si al tercer intento no lo consigue se le anulará la posibilidad de seguir intentándolo
+
{{Tip|En seguida veremos las variables de sesión, pero aún hay que recurrir a los campos ocultos, que muchas veces serán muy útiles :) }}
+
}}
+

Última revisión de 20:15 10 mar 2022

Qué es autentificarse

  • Por autentificarse vamos a entender el mecanismo por el cual el servidor web puede estar relativamente confiado en que está siendo consultado por una determinada máquina y/o persona.
  • Como ejemplos de modos de autentificación, podemos visitar esta página y ver diferentes modos en los que piden autentificarse.
https://www.tractis.com/login

Modos de autentificarse

  1. Contraseña y usuario.
    1. Almacenar el usuario en sesión (Lo veremos más adelante). Lo podríamos considerar el método tradicional y válido para la mayoría de aplicaciones que pudiéramos realizar.
    2. Necesitamos una base de datos dónde almacenar los datos de usuario y contraseña
  2. Dni digital.
  3. Certificados digitales de usuario.
  4. Autentificación basada en Tokens.
    1. Usando el protocolo Auth 2.0 (Lo veremos en app híbridas usando el protocolo Auth 2.0).
    2. Usando JSON Web Token (JWT) http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html
  5. Autentificación en dos pasos
    1. En este método de autentificar, el usuario, además de acreditarse con sus credenciales (usuario y password), se ha verificar con otro método que algún tipo de identificador que el sistema que le ha de autentificar le va a enviar.
    2. SMS OTP (On Time Password) donde el sistema envía un sms a su teléfono móvil que el sistema ha de conocer
    3. Envío de un códiog al correo electrónico. Usado por muchos sistemas como git.
    4. Envío de una URL al sms o al correo electrónico para acceder al sistema
    5. Un siste
  6. Autentificación basada en factores biométricos.
    1. Por ejemplo huella digital o lectura del iris del ojo. Muy utilizada en dispositivos móviles y acceso a espacios reservados.


Icon inter.gif
Delegando la autentifiación basada en token

1.Autentificarse a través de la cuenta de Twiter

https://help.twitter.com/es/managing-your-account/two-factor-authentication

2.Autentificarse a través de la cuenta de Facebook

https://www.xataka.com/basics/como-usar-google-authenticator-para-iniciar-sesion-facebook-mejorar-seguridad-tu-cuenta

3.Autentificarse a través de la cuenta de Google

https://support.google.com/accounts/answer/1066447


  • Seguro que hay mas sistemas y seguro que muy interesantes, pero estos son los que aquí veremos.
  • Nosotros en este tema usaremos el modo de contraseña y usuario. En dos temas posteriores, cuando veamos servicios web usaremos otro sistema como google; igualmente se podría usar la cuenta de facebook o twiter para identificarte, en la relación anterior hay algún enlace por si es de tu interés.

La responsabilidad de exigir una clave de acceso puede recaer sobre el servidor web (en nuestro caso apache), con los módulos de seguridad.

  • En este caso restringimos el acceso a la página o sitio web.
  • Otra opción habitual es tener un sitio con cierto contenido y en el sitio dar la posibilidad de identificarse / registrarse.
  • A usuarios identificados se les ofrece otro contenido diferente.

Respecto a estos conceptos vamos a trabajar este tema que es el primero de tres aspectos de este tema.

Protocolo http vs https

Este es un concepto importante, diferenciar en contenidos que se envíen de forma segura (usar cifrado en el envío que es lo que se hace con https) y en el hecho que para acceder a un sitio tengan un nivel de seguridad que implique que de alguna manera te tengas que autentificar.
La seguridad del envío de datos es otro aspecto diferente del tema de la autentificación.
En seguridad entre otros aspectos tenemos:

  1. La autentificación mecanismos por los cuales podemos confiar en que quien se ha identificado es conocido para el sistema.
  2. La confidencialidad son mecanismos con los que podemos confiar en que nadie puede ver el contenidio de la información ni modificarla durante la transmisión.
HttpVshttps.jpg

Ambos mecanismos debería de trabajar conjuntamente. Por ejemplo si yo envío una contraseña para identificarse, pero con un sniffer, alguien la puede capturar y ver en claro, no conseguimos nada de seguridad.

  • Para la transmisión segura se emplea el protocolo https.
  • Este tema se estudia en el módulo de despliegue de aplicaciones web.
Icon present.gif
Tip: Nosotros usaremos http sin cifrar, pero se insiste en que no es segura la transmisión, pues podría ser objetivo de espía informático.


Autentificación por el servidor web

https://httpd.apache.org/docs/2.4/howto/auth.html
  • Es el propio servidor http quien nos ofrece este método de autentificación.
  • Este tema es un tema de sistemas, y se estudia en módulos correspondintes a despliegue o a la red y sus servicios. En este caso el servicio web.

De cualquier forma como desarrolladores, nos va a interesar y lo vamos a utilizar de dos formas:


Icon key points.gif

Puntos clave

  • 1.-Cómo podemos hacer que sea el servidor el que solicite las credenciales, recoja los datos aportados y verifique contra un fichero previamente generado con identificaciones si cumple o no los criterios establecidos
  • 2.- Cómo podemos hacer para que php recoja los datos de un formulario que va a entregar directamente apache.


  • Para estos cometidos, hemos de configurar el servidor. Es importante entender cómo es la configuración de apache, analicemos y comentemos la siguiente imagen:
Configuracion.png
  • Como vemos, podemos aportar parámetros de configuración de apache para un proyecto concreto incluyendo las directivas necesarias en un fichero llamado .htaccess.
  • Para hacer esto, ese directorio ha de permitir su lectura. Esto implica que ese directorio (o uno del que descienda), tiene que tener activa la directiva AllowOverride, en el fichero de configuración de apache
  • Por lo tanto el primer paso para realizar esta configuración es establecer dicha directiva


Icon activity.jpg
Tarea 1

Verifica Que tienes dicha directiva y confirma que tienes claro en qué directorio hay que establecerla




  1. Definir los usuarios con acceso permitido.
  2. Se puede indicar a qué recursos tiene acceso el usuario en concreto (me refiero a qué páginas).
  3. Generar en cabecera http un código http 401 que es un código de acceso restringido. ##Este código hace que el usuario reciba un formulario para aportar sus credendiales.
  4. El navegador al recibir ese código solicita credenciales.
  5. El servidor recibe estas credenciales y las almacena en sus variables superglobales para futuras solicitudes.

A continuación analizaremos cada uno de estos pasos

Crear la lista de usuarios

ListaUsuarios.png

  • Usamos la herramienta htpasswd para crear un fichero con los usuarios y sus contraseñas
http://httpd.apache.org/docs/2.4/es/howto/auth.html
  • En caso de no tener la herramienta instalada debemos hacer la instalación de las herramientas o utilidades de apache escribiendo:
sudo apt-get install apache2-utils
  • Este comando tiene una serie de opciones que podemos ver en línea de comandos sin mas que escribir su nombre.
Usage:
	htpasswd [-cmdpsD] passwordfile username
	htpasswd -b[cmdpsD] passwordfile username password
 
	htpasswd -n[mdps] username
	htpasswd -nb[mdps] username password
 -c  Create a new file.
 -n  Don\'t update file; display results on stdout.
 -m  Force MD5 encryption of the password (default).
 -d  Force CRYPT encryption of the password.
 -p  Do not encrypt the password (plaintext).
 -s  Force SHA encryption of the password.
 -b  Use the password from the command line rather than prompting for it.
 -D  Delete the specified user.
On other systems than Windows, NetWare and TPF the '-p' flag will probably not work.
The SHA algorithm does not use a salt and is less secure than the MD5 algorithm.
  • Es importante la opción -c para crear el fichero. Recuerda usarla sólo la primera vez; cuando la usas se crea el fichero, y si ya existiera se elimina el contenido del fichero y se crea de nuevo.
  • Para incorporar nuevos usuarios se escribe sin opción y se añade el nombre de los usuario
  • Por seguridad es importante añadir el fichero en una ubicación fuera del directorio documentRoot del servidor web.

Indicar los recursos restringidos : .htaccess

  • Para este cometido, apache nos permite usar el famoso fichero .htaccess que a continuación vamos a explicar.
  • Para habilitar el uso de este fichero debemos indicarle al servidor web que vamos a utilizarlo. Esto se especifica en la directiva AllowOverride
  • Para más información ver
http://www.bdat.net/documentos/apache/x367.html

Y la oficial (siempre la mejor).

 http://httpd.apache.org/docs/2.4/es/mod/core.html#allowoverride
  • En nuestro caso tenemos que poner el valor AuthConfig o bien All
  • Una vez que hemos hecho esto, cada vez que vaya a coger un fichero de un determinado directorio, antes de entregarlo, verificará que si existe un fichero .htaccess en ese directorio, en cuyo caso pedirá credenciales.
  • Para indicar los recursos restringidos usaremos las siguientes directivas (Este será el contenido del fichero .htaccess
  • AuthName Nombre de dominio de la authentificación.
  • AuthType Tipo de autentificación, pudiendo ser Basic y más segura Digest, donde se ustilizan una cadena 'realm' y dos valores únicos generados por el servidor con por ejemplo
    md5(uniqid())
    llamados nonce y opaque.
  • AuthUserFile Ruta del fichero de los usuarios con permiso.
  • AuthGroupFile Ruta del fichero de los usuarios con permiso.
  • Require valid-user o usuarios concretos de la lista que sí que tendrán acceso al recursos si se acreditan correctamente. group o grupos concretos a validar
Htaccess.png



Icon activity.jpg
Accesos restringidos

Accesos Restringidos



  • En el caso de querer crear un grupo se haría de la siguiente manera
  • Primero creamos un grupo en un fichero
grupo1: user1 user2 user3
  • guardamos esta información en un fichero, por ejemplo
/home/manuel/credenciales/grupoAdmin
  • Por supuesto estos usuarios deben de ser incluidos en el fichero de password, con el comando htpasswd
  • Y ahora especificamos el grupo en las restricciones de acceso en el fichero .htaccess con la directiva AuthUserFile para especificar el grupo y en la directiva RRequire' especificamos group y nombre de grupo.
AuthType Basic
AuthName Restricción de grupos
AuthUserFile /home/manuel/credenciales/passwords
AuthGroupFile /home/manuel/credenciales/grupoAdmin
Require group
Icon present.gif
Tip: Recordar que el módulo de grupo debe de estar habilitado
a2enmod authz_groupfile


  • En este caso la validación la hace el servidor apache. Es decir, si se ejecuta el fichero solicitado, es porque apache ya ha validado.
  • Si se validó previamente, apache utiliza cookies de sesión, que desde php no podemos modificar ni borrar, por lo que si volvemos a entrar en la página ya no nos pedirá validación.
  • Observa el ejemplo anterior en el cual se ha creado una página para eliminar el usuario dejando solo acceso a un usuario que no existe y así forzamos que se borre el anteriormente registrado.

PHP accediendo a información http

  • Ahora viene la parte que realmente nos interesa a nosotros/as, qué es usar esto, dentro de nuestro código php.
  • En este caso no vamos a necesitar el fichero .htaccess, ya que no queremos que apache realice la validación, queremos hacerla dentro de nuestro script.
  • Desde el código de php podemos acceder a la información facilitada por el servidor.
  • Tenemos que conseguir hacer que si se validó correctamente ejecutemos el script completo y si no se ha validado que se le entregue un formulario de validación que entrega apache cuando queremos validar.
  • Para ello vamos a usar la función header para crear cabeceras y entregar un página para autentificarse en caso de que no se haya autentificado (el formulario), y si se ha identificado cogeremos las credenciales facilitadas y las verificaremos.
  • Para recoger las credenciales del formulario, accederemos a la matriz asociativa $_SERVER


Icon activity.jpg
Accediendo a las credenciales del formulario que ofrece apache
  • La matriz asociativa variable superglobal $_SERVER contiene esta información.

Concretamente los índices:

  1. PHP_AUTH_USER Es el nombre del usuario
  2. PHP_AUTH_PW Es la password del usuario
  3. AUTH_TYPE Es el tipo de seguridad utilizado


Icon activity.jpg
PHP accediendo a los datos de identificación

Php accediendo a los datos de identificación






Usar función header para la autentificación

  • La referencia de la función header Sirve para crear cabeceras de la página solicitada
http://es.php.net/manual/es/function.header.php

Vamos a usarla para unas acciones concretas.

Modificar el texto de error

En este caso no vamos a usar el fichero .htaccess. Cuando accedemos a una página y no nos hemos identificado aparece un error 401. Nosotros vamos a solicitar una autentifiCación tipo basic. < br/> Para ello especificamos la cabecera WWW-Authenticate.Ademas de especificar el modo de autentificación ponemos el mensaje que verá el usuario:

    header('WWW-Authenticate: Basic Realm="Página de acceso restringido. Necesitas credenciales"');
  • Para no mostrar la página solicitada se envía un código 401, lo que provoca que se solicite un usuario y contraseña antes de visualizar el resto de la página. El código quedaría:
    header('HTTP/1.0 401 Unauthorized');

El código completo quedaría:

 <?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
    header('WWW-Authenticate: Basic Realm="Contenido restringido"');
    header('HTTP/1.0 401 Unauthorized');
    echo "Usuario no reconocido!";
    exit;
}
?>
  • Ahora debemos poder especificar cuál va a ser el usuario esperado en esta página. Por ejemplo en la página anterior insertamos un usuario cualquiera y una password cualquiera entraremos ya que no comparamos con ningún valor.
<?php
    echo"Nombre de usuario: ".$_SERVER['PHP_AUTH_USER'] ."<br />";
    echo"Contraseña: ".$_SERVER['PHP_AUTH_PW'] ."<br />";
?>

Verificar el usuario y contraseña

Con el siguiente código verificaríamos el usuario y contraseña usando el modo de header.

<?php
if ($_SERVER['PHP_AUTH_USER']!='manolo' || $_SERVER['PHP_AUTH_PW']!='passManolo.') {
    header('WWW-Authenticate: Basic Realm="Contenido restringido"');
    header('HTTP/1.0 401 Unauthorized');
    echo "Usuario no reconocido!";
    exit;
}
?>
  • Esto nos podría servir, puesto que el código no se envía al cliente, y él nunca podría ver la password, ni el usuario. No obstante, siempre será una opción más segura, y más versátil tener el usuario almacenado en una base de datos que ya veremos más adelante cuando veamos bases de datos.