Etiqueta

22 de julio de 2015

Autenticación “Web Service”

A continuación describimos cómo configurar nuestro servidor web para que soporte autenticación “Web Service” basados en “REST”. (Disponible desde Omnis Studio 6.1.)

Por supuesto deberemos configurar nuestra librería Omnis, pero al margen de esto y cuando estamos utilizando un “simple” servidor Web (es decir no un servicio incorporado mediante Tomcat), podemos configurar la dirección URL del servicio web para que soporte autenticación básica (basic) o implícita (digest). También dispondremos de la opción de usar https y certificación para dar soporte a conexiones seguras.

A continuación incluimos algunas notas sobre cómo configurar Tomcat, Apache Web Server y IIS para que soporten autenticación básica (basic) o implícita (digest). Si así lo hacemos, el servidor Web será el encargado de autenticar a los clientes, a Omnis sólo pasará la solicitud una vez que cliente se ha autenticado correctamente; las cabeceras HTTP incluirán los datos con los detalles correspondientes, el llamado “Authorization header”.

Omnis Studio 6.1 posee una nueva función denominada parsehttpauth(auth) que permite examinar el contenido HTTP del “Authorization header”, ésta nos devolverá una variable de tipo “row” con la información extraída. La primera columna de la “row” con el nombre “scheme”, es el tipo de esquema (por ejemplo “basic”). El contenido del resto de las columnas, dependerá del tipo de esquema de que se trate. Por ejemplo, para las cabeceras siguientes:

Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

La “row” devuelta contendrá las siguientes 3 columnas:
  • scheme: basic
  • username: Aladdin
  • password: open sesame

Digest username="Mufasa",realm="testrealm@host.com",nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",uri="/dir/index.html",qop=auth,nc=00000001,cnonce="0a4f113b",response="6629fae49393a05397450978507c4ef1",opaque="5ccc069c403ebaf9f0171e9517f40e41"


La “row” devuelta contendrá las siguientes 10 columnas:
  • scheme: digest
  • username: Mufasa
  • realm: testrealm@host.com
  • nonce: dcd98b7102dd2f0e8b11d0f600bfb0c093
  • uri: /dir/index.html
  • qop: auth
  • nc: 00000001
  • cnonce: 0a4f113b
  • response: 6629fae49393a05397450978507c4ef1
  • opaque: 5ccc069c403ebaf9f0171e9517f40e41

OAuth realm="Example",oauth_consumer_key="0685bd9184jfhq22",oauth_token="ad180jjd733klru7", oauth_signature_method="HMAC-SHA1",oauth_signature="wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D", oauth_timestamp="137131200",oauth_nonce="4572616e48616d6d65724c61686176",oauth_version="1.0"

La “row” devuelta contendrá las siguientes 9 columnas:
  • scheme: oauth 
  • realm: Example
  • oauth_consumer_key: 0685bd9184jfhq22
  • oauth_token: ad180jjd733klru7
  • oauth_signature_method: HMAC-SHA1
  • oauth_signature: wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D
  • oauth_timestamp: 137131200
  • oauth_nonce: 4572616e48616d6d65724c61686176
  • oauth_version: 1.0

Bearer 0b79bab50daca910b000d4f1a2b675d604257e42


La “row” devuelta contendrá las siguientes 2 columnas:
  • scheme: bearer
  • token: 0b79bab50daca910b000d4f1a2b675d604257e42

Para cualquier otro tipo de “scheme”, la “row” devuelta contendrá las siguientes 2 columnas:

  • scheme: nombre del esquema en minúsculas
  • data: resto de datos de la cabecera

Tomcat


Lo descrito a continuación ha sido testado con Tomcat 7.0.42 y Windows 8.1. Será necesario reiniciar Tomcat para que los cambios tengan efecto.

 

Autenticación “basic”


Configure el/los usuarios: Editando el fichero “conf/tomcat-users.xml”:

Añada el/los perfil(es) y usuario(s) bajo el item ≤tomcat-users≥, por ejemplo:

≤role rolename="omnisrest"/≥
≤user username="bobm" password="bobm" roles="omnisrest"/≥


Edite el fichero “web.xml” del “webapp” “omnisrestservlet” (carpeta WEB-INF);

Agregue lo siguiente después del item “servlet-mapping”:

≤security-constraint≥
≤web-resource-collection≥
≤web-resource-name≥All resources≤/web-resource-name≥
≤url-pattern≥/*≤/url-pattern≥
≤/web-resource-collection≥
≤auth-constraint≥
≤role-name≥omnisrest≤/role-name≥
≤/auth-constraint≥
≤user-data-constraint≥

≤!—el “transport-guarantee” podrá ser CONFIDENTIAL, INTEGRAL, o NONE --≥
≤transport-guarantee≥NONE≤/transport-guarantee≥
≤/user-data-constraint≥
≤/security-constraint≥
≤login-config≥
≤auth-method≥BASIC≤/auth-method≥
≤realm-name≥omnisrest≤/realm-name≥
≤/login-config≥

 

Autenticación “digest”


Igual que el anterior, excepto que el “auth-method” deberá ser “DIGEST”.

Probando el servicio SSL

Sobre el fichero “conf/server.xml”:

Elimine el comentario del conector SSL y modifíquelo, para dejarlo en algo como:

≤Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="C:\apache-tomcat-7.0.42\mykeystore" keystorePass="xxxxxx"/≥

Cree el certificado auto firmado para añadirlo al “keystore” de “tomcat”:

Nota: Será necesario indicar un nombre y apellido para el “localhost” (eso nos permitirá probar el servidor localmente, con “OWEN” como cliente)

"C:\Program Files (x86)\Java\jdk1.6.0_37\bin\keytool" -genkeypair -alias mycert -keyalg RSA - validity 10000 -keystore c:\apache-tomcat-7.0.42\mykeystore

Uso del cliente Omnis “OWEB” para pruebas:

Extracción del certificado:

"C:\Program Files (x86)\Java\jdk1.6.0_37\bin\keytool" -exportcert -alias mycert -keystore c:\apache-tomcat-7.0.42\mykeystore -file my_root_cert

Importación del certificado al “omnisTrustStore”:

cd \secure\cacerts

"C:\Program Files (x86)\Java\jdk1.6.0_37\bin\keytool" -importcert -alias my_tomcat - keystore omnisTrustStore -file c:\apache-tomcat-7.0.42\my_root_cert

Ahora podrá utilizar URLs como:

https://localhost:8443/omnisrestservlet/ws/5988/api/phase2/myapi/conTomcat

Nota: para eliminar la copia de un certificado use:

"C:\Program Files (x86)\Java\jdk1.6.0_37\bin\keytool" -delete -alias my_tomcat -keystore omnisTrustStore

 

Apache Web Server


Autenticación “basic”


Cree un usuario y su contraseña:

c:\apache24\bin\htpasswd -c c:\apache24\test_passwords test

Note: -c is optional - required the first time to create the passwords file

Edite el fichero “httpd.conf”, la entrada “omnisrest” deberá ser algo como esto:

≤Location /omnisrest≥
     SetHandler omnisrest
     AuthType Basic
     AuthName "omnisrest"
     AuthBasicProvider file
     AuthUserFile c:\apache24\test_passwords
     Require user test
≤/Location≥


El “Require” podrá ser “Require user...”, “Require valid-user” o “Require group...”. Consulte la documentación de Apache para más información.

 

Autenticación “digest”


Cree un usuario y su contraseña:

c:\apache24\bin\htdigest -c c:\apache24\test_digest_passwords omnisrest test
Nota: El uso de “-c” es opcional, pero necesario para la primera vez que se crear el archivo de contraseñas.

Edite el fichero “httpd.conf”, la entrada “omnisrest” deberá ser algo como esto:

≤Location /omnisrest≥
     SetHandler omnisrest
     AuthType Digest
     AuthName "omnisrest"
     AuthDigestDomain /omnisrest/
     AuthDigestProvider file
     AuthUserFile c:\apache24\test_digest_passwords
     Require valid-user
≤/Location≥


Des comente la entrada “LoadModule auth_digest_module modules/mod_auth_digest.so” del fichero “httpd.conf”.

El “Require” podrá ser “Require user...”, “Require valid-user” o “Require group...”. Consulte la documentación de Apache para más información.

IIS


Autenticación “basic”


IIS es bastante difícil de configurar (o al menos el “IIS Express” donde ha sido probado). Para habilitar el modo de autenticación “basic”, es necesario deshabilitar la autenticación “anonymous” del archivo “AppServer\applicationhost.config” ubicado bajo el directorio de instalación de IIS Express. Búsqueda la entrada “authentication” correspondiente.

Añada el código siguiente al final del archivo “applicationhost.config”:

≤location path="Default Web Site/cgi-bin/omnisrestisapi.dll"≥
≤system.webServer≥
≤security≥
≤authentication≥
≤basicAuthentication enabled="true" /≥
≤/authentication≥
≤/security≥
≤/system.webServer≥
≤/location≥


Después, podrá utilizar cualquier usuario existente y su contraseña con las URLs protegidas – se necesita disponer de una cuenta de usuario “standard” para que funcione.

16 de julio de 2015

Formato del método $showurl

Sintaxis: $showurl(cURL[,cFrame,cWindowProperties])

cURL: Es la dirección de la página a presentar en una nueva ventana o el marco específico de la venta cliente en la página HTML.

cFrame: Es el nombre de un marco HTML. Si cFrame está vacío, la página se mostrará  en una nueva ventana, de lo contrario se mostrará en el marco especificado y sobre la ventana actual.

cWindowProperties: Parámetro opcional, si no existe cFrame será ignorado. De lo contrario, tiene el mismo formato que en los argumento del comando javascript equivalente el "window.open", por ejemplo, especificar "toolbar = 0, menubar = 1" indicaría que la ventana del navegador tendrá una barra de menú, pero no una barra de herramientas.

Sus posibles opciones son:

toolbar - si la ventana del navegador tendrá una barra de herramientas
status - si la ventana del navegador tendrá una barra de estado
menubar - si la ventana del navegador tendrá una barra de menú
scrollbars - si la ventana del navegador tendrá barras de desplazamiento
resizable - si la ventana del navegador es de tamaño variable
location - si la ventana del navegador tendrá una barra para direcciones
directories - si la ventana del navegador mostrará el directorio Web
width - anchura de la ventana del navegador
height - altura de la ventana del navegador
top  - coordenada superioresde la ventana del navegador
left - coordenada izquierda de la ventana del navegador

Todas las opciones son booleanas (sólo valores 0 o 1) a excepción de la width, height, top y left, que deberán contener valores expresados en píxel's.

15 de julio de 2015

Uso de la utilidad del sistema "ditto" de Mac OS, desde Omnis

Crear un Zip, basePath y destName son las respectivas rutas de origen y destino del archivo.


Begin text block
    Text: set dir to "[basePath]" as string (Carriage return)
    Text: set dest to "[destName]" as string (Carriage return)
    Text: set scriptText to "ditto -rsrc -c -k --sequesterRsrc --keepParent " & quoted form of the POSIX path of dir & " " & quoted form of the POSIX path of dest (Carriage return)
    Text: do shell script scriptText
End text block
Get text block script
Do $runapplescript(script,result) Returns error


Descomprimir un Zip, basePath y destName son las respectivas rutas de origen y destino del archivo.


Begin text block
    Text: set dir to "[basePath]" as string (Carriage return)
    Text: set dest to "[destName]" as string (Carriage return)
    Text: set scriptText to "ditto -rsrc -x -k " & quoted form of the POSIX path of dir & " " & quoted form of the POSIX path of dest (Carriage return)
    Text: do shell script scriptText
End text block
Get text block script
Do $runapplescript(script,result) Returns error


Esto eliminaría el archivo temporal después de la copia/descompresión.


Begin text block
    Text: set source to "[pFrom]" as string (Carriage return)
    Text: set targetdir to "[pTo]" as string (Carriage return)
    Text: tell application "Finder" (Carriage return)
    Text: duplicate source to targetdir (Carriage return)
    Text: end tell
End text block
Get text block lScript
Do $runapplescript(lScript,lResult) Returns lnError