Seguridad en Web Service

Mi consulta es la siguiente:

Estoy implementando un webservice para conectarlo con un cliente
desarrollado en Flex. Envio los datos en XML. Y aqui tengo mi primera
pregunta:

  • Si formateo los datos a traves de la vista (a diferencia de hacerlo
    con el render :xml => @bug.to_xml) creo que el tipo de datos enviado al
    navegador web no es un tipo mime XML porque no me sale formateado como
    tal. Como puedo especificar que el tipo mime enviado es XML? Lo cierto
    es que la transferencia de datos funciona parfectamente, por lo que este
    es un problema menor.

La siguiente pregunta es sencilla y, a la vez, compleja: Quiero que la
seguridad de datos se implemente a nivel de servidor web. Me explico: El
servicio web debe enviar los datos segun el usuario logeado, pero ese
logeo lo quiero hacer por HTTP, cuando se requiere una pagina web. Esto
implica lo
siguiente:

  • El servicio web, debe acceder a la cuenta de usuario logeado.
  • Hay que definir las cuentas de usuario del servidor web y configurarlo
    para que las utilice.

Por esto tengo varias preguntas:

  • La facil: Como obtengo con rails el nombre de usuario autentificado en
    el sistema? Lo que en .NET es: “Request.ServerVariables[“LOGON_USER”]” o
    en PHP es “$_SERVER[‘PHP_AUTH_USER’]”. No debe ser muy complicado en
    Rails…
  • Me recomendais otra manera de hacerlo? Por ejemplo: Enviando el nombre
    de usuario/contraseña por cada peticion?
  • Lo “complicado”: Mi idea es montar un servidor LDAP para la gestion de
    usuarios. Para hacer todo lo que quiero en Apache, mas o menos me
    imagino como hacerlo. Pero estoy leyendo por ahi el rendimiento del
    servidor nginx.
    Se podria implementar lo que quiero (validacion de usuarios HTTP contra
    un servidor LDAP) con este servidor web?

Muchas gracias por vuestro tiempo y vuestra dedicacion.

Un saludo
Roberto Oliva

Hola a todos!

Ya que veo que nadie constesta me lo voy a decir yo todo :wink: por si hay
alguien que le pueda interesar (quiza la no respuesta por parte del
foro, es como un empujon a la investigacion para buscar la solucion por
todos los medios posibles)

  • Si formateo los datos a traves de la vista (a diferencia de hacerlo
    con el render :xml => @bug.to_xml) creo que el tipo de datos enviado al
    navegador web no es un tipo mime XML porque no me sale formateado como
    tal. Como puedo especificar que el tipo mime enviado es XML? Lo cierto
    es que la transferencia de datos funciona parfectamente, por lo que este
    es un problema menor.

Para indicar que el contenido es XML hay que establecer el Content-Type
a text/xml:

@response.headers[“Content-Type”] = “text/xml”

Por esto tengo varias preguntas:

  • La facil: Como obtengo con rails el nombre de usuario autentificado en
    el sistema? Lo que en .NET es: “Request.ServerVariables[“LOGON_USER”]” o
    en PHP es “$_SERVER[‘PHP_AUTH_USER’]”. No debe ser muy complicado en
    Rails…

Pos se hace de la siguiente manera:

if request.env.has_key? ‘X-HTTP_AUTHORIZATION’
# try to get it where mod_rewrite might have put it
@authdata = @request.env[‘X-HTTP_AUTHORIZATION’].to_s.split
elsif request.env.has_key? ‘HTTP_AUTHORIZATION’
# this is the regular location
@authdata = @request.env[‘HTTP_AUTHORIZATION’].to_s.split
end

at the moment we only support basic authentication

if @authdata and @authdata[0] == ‘Basic’
@user, @pass = Base64.decode64(@authdata[1]).split(‘:’)[0…1]
end

Lo he obtenido del siguiente enlace:
http://blogs.23.nu/c0re/stories/7409/

  • Lo “complicado”: Mi idea es montar un servidor LDAP para la gestion de
    usuarios. Para hacer todo lo que quiero en Apache, mas o menos me
    imagino como hacerlo. Pero estoy leyendo por ahi el rendimiento del
    servidor nginx.
    Se podria implementar lo que quiero (validacion de usuarios HTTP contra
    un servidor LDAP) con este servidor web?

Pues supongo que se podra hacer, pero como el objetivo no es montar un
servidor de paginas estaticas muy eficiente (de hecho no voy a servir
ningun elemento estatico) no me importa la efectividad del Reverse
Proxy, asi que no me voy a complicar la vida montando Pound o Nginx y
voy a montar Apache, que va a tener 3 objetivos:

  • Validar los usuarios contra LDAP
  • Encriptar/Desencriptar las comunicaciones mediante canal SSL.
  • Envio de los datos por HTTP a uno o varios servidores Mongrel (Reverse
    Proxy).

En fin, muchas gracias por vuestra ayuda. Probablemente mi planteamiento
sea algo complejo o no sea una implementacion estandar. Lo cierto es que
estoy bastante emocionado porque con Rails, todas las piezas van
encajando de una manera perfecta.

Saludos
Roberto M. Oliva