Recents
Consumir servicios web bajo https y/o autenticaciónUnofficial Content

English version

Consumir web services bajo https / autenticación / proxy

 El siguiente documento se divide en 3 partes: la primera explica cómo consumir un servicio web seguro (https), la segunda cómo consumir un servicio web con autenticación y la tercera como consumir un servicio web a traves de un proxy. No se profundizará en aspectos técnicos de lo que es una comunicación SSL, conceptos de clave pública/privada etc. 

Consumiendo un web service bajo https

 Básicamente el consumir un web service bajo https implica 2 pasos fundamentales:

 

1)     Consumir el wsdl que se encuentra bajo https

2)     Importar el certificado y manejo del almacén de certificado (keystore)  

 

1)   Consumiendo el wsdl

 

En el caso de servicios bajo https, es necesario obtener el wsdl como archivo para luego inspeccionarlo con el WSDL Inspector de manera local usando el protocolo file (ver imagen). Una manera de obtener el wsdl puede ser accediendo al mismo mediante el browser para luego hacer un ?Save as? de la página.

 

Web service seguro/autenticación - wsdl inspector 

 

Una vez inspeccionado el servicio ya se puede programar el consumidor del web service como se hace comúnmente. La única salvedad es que será necesario crear una variable del tipo Location para indicar que el web service está bajo https, ejemplo:

 

 

&location = getlocation("org_tempuriaction__wssuma")

&location.port = 8443

&location.secure = 1

&suma = &ws.execute(5, 3)

 

Siendo "org_tempuriaction__wssuma" el nombre dle objeto externo. Mas información,  función GetLocation

Es posible también utilizar el archivo location.xml en vez del tipo de datos.

2)   Importar el certficado y manejo del almacén de certificado (keystore)

 

Este paso varia dependiendo de la plataforma:  

     - Ambiente Java

     - Ambiente .NET

 

Consumiendo un web service bajo autenticación

 

Consumir un web service bajo autenticación es similar a cualquier otro web service, solo es necesario crear un tipo de datos Location para poder indicar los datos de la autenticación. El código fuente de un ejemplo sería:

 

    &location = getlocation("org_tempuriaction__wssuma")

    &location.Authentication = 1

    &location.AuthenticationMethod = 0

    &location.AuthenticationRealm="UnRealm"

    &location.AuthenticationUser="admin"

    &location.AuthenticationPassword="admin"

    &resultado = &ws.Execute(&parm1,&parm2)

 

A modo de resumen los parámetros anteriores son:

 

  • &location.Authentication = 1: Indica que efectivamente se va a consumir un servicio que está bajo autenticación.
  • &location.AuthenticationMethod = 0: Indica que se utilizará autenticación Basic (el otro valor posible es 1 = Digest). Más info
  • &location.AuthenticationRealm="UnRealm". El realm es ?el lugar contra el cual se autentica un usuario? y puede ser una base datos, un directorio ldap entre otros (se define en el propio servidor de servlets). En este caso nos interesa el nombre ?ficticio? de ese realm el cual puede verse en el cuadro de autenticación que se presenta al tratar de acceder al sitio usando el browser:

Web service seguro/autenticación - realm 

 

  • &location.AuthenticationUser: Usuario a autenticar (que existe en el realm anterior).
  • &location.AuthenticationPassword: Password del usuario.

 Consumiendo un web service a través de un proxy

Ya sea porque se tiene un Proxy de salida desde el cliente a Internet para consumir el servicio  o un Proxy de entrada en el Server que ofrece el servicio, se debe configurar los parámetros del mismo en los métodos ProxyserverHost, ProxyServerPort, ProxyServerUserName, ProxyServerPassword del tipo de datos location (o de location.xml)  
Por ejemplo, podríamos programar el siguiente código GeneXus:
    
  &location = getlocation('xxxx')
  &location.ProxyServerHost = "Host"
  &location.ProxyServerPort = 80
  &location.ProxyAuthentication = 1
  &location.ProxyAuthenticationMethod = 1
  &location.ProxyAuthenticationUser = "user"
  &location.ProxyAuthenticationPassword = "password"
  &location.ProxyAuthenticationRealm = "realm"
  &ws.execute()