7. Autenticación HTTP

El documento RFC 2617 define dos mecanismos para la autenticación HTTP: el básico y el Digest. WEBrick soporta ambos y verifica la información de autenticación contra una base de datos de usuarios compatible con Apache específica de cada usuario.

La definición del fichero con la base de datos de usuarios puede ser problemática. Con la autenticación "básica" se puede evitar la creación de esta base de datos. Para ello se le puede pasar a WEBrick un bloque de código que devuelve "true" si la autenticación es valida y "false" en caso contrario, como puede verse en el siguiente ejemplo:


    realm= "Gnome's realm"
    start_webrick do |server|
      server.mount_proc( '/convenient_basic_auth' ) do |req, res|
        HTTPAuth.basic_auth( req, res, realm ) do |user, pass|
          # este bloque devuelve 'true' si las
          # autenticación es valida
          user == 'gnome' && pass == 'secreto'
        end
        res.body= "Estas autorizado a ver los datos secretos\n"
      end
    end
  

    [jfglez@localhost servlets]$ w3m -dump http://localhost:8080/convenient_basic_auth
    Username for Gnome's realm: gnome
    Password:
    Estas autorizado a ver los datos secretos.
  

7.1. Autenticación básica

La autenticación básica la realiza la clase HTTPAuth::BasicAuth. Si se utiliza un fichero con la base de datos de usuarios, éste debe ser similar a los que genera htpasswd (comando del servidor HTTP de Apache). El analizador HTTPAuth::Htpasswd sólo puede descifrar las contraseñas generadas utilizando la función estándar crypt(). Esto significa que el comando htpasswd hay que ejecutarlo con el parámetro -d. En todas las plataformas excepto en Windows y TPF, -d es un argumento por defecto.


    realm= "Gnome's realm"
    start_webrick do |server|
      htpasswd= HTTPAuth::Htpasswd.new( '/tmp/gnome.htpasswd' )
      authenticator= HTTPAuth::BasicAuth.new(
        :UserDB=> htpasswd,
        :Realm=> realm
      )
      server.mount_proc('/htpasswd_auth') do |req, res|
        authenticator.authenticate( req, res )
        res.body= "Estas autenticado para ver datos supersecretos\n"
      end
    end

    # -c Crea un fichero de contraseñas
    # -d Utiliza por defecto la función 'crypt'
    # -b Acepta contraseñas especificadas en la línea de comandos
  

    [jfglez@localhost ~]$ htpasswd -cdb /tmp/gnome.htpasswd gnome supersecretpasswd
    Adding password for user gnome
    [jfglez@localhost ~]$ cat /tmp/gnome.htpasswd
    gnome:59Ff7kZixdCAE
    [jfglez@localhost ~]$ w3m -dump http://localhost:8080/htpasswd_auth
    Username for Gnome's realm: gnome
    Password:
    Estas autenticado para ver datos supersecretos
   

7.2. Autenticación Digest

Para realizar esta autenticación, WEBrick necesita que exista un fichero con la bases de datos de usuarios autorizados. Este fichero debe tener un formato similar al que produce htdigest. El analizador del fichero es HTTPAuth::Htdigest y el autenticador HTTPAuth::DigestAuth.


    realm= "Gnome's realm"
    start_webrick do |server|
      htdigest= HTTPAuth::Htdigest.new('/tmp/gnome.htdigest')
      authenticator= HTTPAuth::DigestAuth.new(
        :UserDB=> htdigest,
        :Realm=> realm
      )
  
      server.mount_proc( '/htdigest_auth' ) do |req, res|
        authenticator.authenticate( req, res )
        res.body= "Estas autenticado para ver datos super secretos\n"
      end
    end
  

    [jfglez@localhost docs]$ htdigest -c /tmp/gnome.htdigest "Gnome's realm" gnome
    Adding password for gnome in realm Gnome's realm.
    New password:
    Re-type new password:
    [jfglez@localhost docs]$ cat /tmp/gnome.htdigest
    gnome:Gnome's realm:50bbb886000baf02b012f0c12a2b1f2b
    [jfglez@localhost docs]$ w3m -dump http://localhost:8080/htdigest_auth
    Username for Gnome's realm: gnome
    Password:
    Estas autenticado para ver datos super secretos