Utilizar la api login REST para obtener un ticket

cancel
Showing results for 
Search instead for 
Did you mean: 
magarcia_sm
Active Member II

Utilizar la api login REST para obtener un ticket

Buenas tardes a todos

   Estamos intentando crear un archivo JS para que desde una web podamos obtener un ticket de autenticación en nuestro Alfresco 4.2. Estamos intentando utilizar la api de REST mediante un script realizando esta llamada

function getTicket(login,password, numDoc, clave)
{


        var urlTicket="http://urlAlfresco/service/api/login?u="+login+"&pw="+password;
        
        
          var xmlHttp = new XMLHttpRequest();
          
          xmlHttp.open( "GET", urlTicket, false ); // false for synchronous request
          xmlHttp.setRequestHeader('Access-Control-Allow-Headers', '*');
          xmlHttp.setRequestHeader('Access-Control-Allow-Origin', '*');
          xmlHttp.onload = function()  {
            var requestData = xmlHttp.responseText;
            var ticket = "";
            if ((requestData!=='')&&(requestData!==NULL)){ticket = requestData.toString().substring(47,94);}
            if (ticket!=="")
                {
                    window.location.href = "http://urlAlfresco/service/showContent?nFact="+numFact+"&cPro="+CIF+"&alf_ticket="+ticket;
                }    
          }
          
          
         xmlHttp.onerror=function(){alert("No funciona");};
         xmlHttp.send(null);
       

}

El problema es que la llamada para hacer el request (GET) de la función http://urlAlfresco/service/api/login nos falla y no nos da respuesta. (Hemos intentado el método POST) pero nos da el mismo fallo.

Hemos leido por ahí que parece ser que hay un problema con la configuración CORS y la versión de Alfresco 4.2 que estamos utilizando.  Pero aunque hemos aplicado los filtros en el fichero web.xml que hemos encontrado en otros foros, sigue sin funcionarnos.

Nosotros lo que pretendemos es que un tercer sistema independiente pueda enviar una llamada a una URL desde JavaScript introduciendo como parámetros el login y password del usuario, y los metadatos del archivo almacenado en Alfresco y que este se descargue o muestre en el navegador (son todos PDF's).

Si no podemos utilizar el método http://urlAlfresco/service/api/login, ¿Qué opciones nos quedan para poder obtener esto que pretendemos conseguir?.

¿Es posible conseguir esto en Alfresco 4.2?

12 Replies
magarcia_sm
Active Member II

Re: Utilizar la api login REST para obtener un ticket

Sólo por comentar por si puede valer de ayuda. Lo que es raro es que si utilizamos la url a la api directamente desde el navegador

http://urlAlfresco/service/api/login?u=login&pw=password

funciona perfectamente y el navegador muestra el ticket de autenticación..... pero la llamada con la request GET, nos da error.

angelborroy
Alfresco Employee

Re: Utilizar la api login REST para obtener un ticket

Es lo que iba a decir, que eso funciona perfectamente.

Creo que es un problema con la API que utilizáis.

Tenéis algún ejemplo en https://github.com/agea/Alfresco-HTML5-Client y en https://github.com/AlfrescoLabs/AlfJS pero ambos usan frameworks de JavaScript diferentes al vuestro.

Hyland Developer Evangelist
magarcia_sm
Active Member II

Re: Utilizar la api login REST para obtener un ticket

Muchas gracias Angel

Hemos intentado realizar la conexión con los dos ejemplos que nos has pasado pero nos sigue dando el mismo error

XMLHttpRequest cannot load http://ipserver:8080/alfresco/service/api/login. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:63342' is therefore not allowed access.

Hemos leido por otros foros que esto puede ser culpa de la configuración de CORS en Alfresco y que deberíamos añadir la librería: cors-filter-1.3.2.jar.

Hemos añadido la librería en tomcat/lib de Alfresco y configurado el web.xml incluyendo los siguientes filtros, tal y como se indican en algun post del foro

<filter>     <filter-name>springSecurityFilterChain</filter-name>     <filter-class>         org.springframework.web.filter.DelegatingFilterProxy     </filter-class> </filter>   <filter-mapping>     <filter-name>springSecurityFilterChain</filter-name>     <url-pattern>/*</url-pattern> </filter-mapping>  <filter>     <filter-name>CORS</filter-name>     <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>      <init-param>         <param-name>cors.allowOrigin</param-name>         <param-value>*</param-value>     </init-param>     <init-param>         <param-name>cors.supportsCredentials</param-name>         <param-value>false</param-value>     </init-param>     <init-param>         <param-name>cors.supportedHeaders</param-name>         <param-value>
Accept, Origin, X-Requested-With, Content-Type, Last-Modified
</param-value>
</init-param>
<init-param>
<param-name>cors.supportedMethods</param-name>
<param-value>GET, POST, HEAD, OPTIONS</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CORS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

Pero nos sigue dando el mismo error.

Por otro lado hemos intentado meter el jar en el tomcat/webapps/alfresco/web-inf/lib, pero así no nos arranca alfresco, aunque no muestra ningún error en el log... se queda como "colgado".

¿Sabes si la llamada a la api login en la 4.2 funciona desde una llamada request? Yo no se si nos estamos complicando mucho la vida para algo que suena que debería ser sencillo :-).

Bueno, ya me comentas tus impresiones para ver por donde podemos ir tirando, muchas gracias por adelantado!!

magarcia_sm
Active Member II

Re: Utilizar la api login REST para obtener un ticket

Por si vale de algo el código de la función que estamos utilizando de estos dos proyectos es

 $.ajax({
    url: 'http://ipserver/alfresco/service/api/login',

    data: JSON.stringify({
      username: cmis.vm.username(),
      password: cmis.vm.password()
    }),

    contentType: 'application/json',
    type: 'POST',
    dataType: 'json',

    success: function (data) {
      cmis.vm.ticket(data.data.ticket);

      if (cmis.vm.rememberMe()) {
        store.set('username', cmis.vm.username());
        store.set('password', cmis.vm.password());
        store.set('rememberMe', cmis.vm.rememberMe());
        store.set('autoLogin', cmis.vm.autoLogin());
      } else {
        store.set('username', null);
        store.set('password', null);
        store.set('rememberMe', false);
        store.set('autoLogin', false);
      }

      // init
      $.getJSON('http://ipserver/ /alfresco/cmisbrowser', function (data) {
        cmis.vm.loggedIn(true);
        cmis.cb = data;
        for (var repo in cmis.cb) {
          cmis.repo = cmis.cb[repo];
        }
        if (parseFloat(cmis.repo.productVersion) < 4.2) {
          head.js(config.compat40, function () {
            cmis.loadRoot();
          });
        } else {
          cmis.loadRoot();
        }
      });

    }
  })

Un saludo

angelborroy
Alfresco Employee

Re: Utilizar la api login REST para obtener un ticket

Es un problema claro de CORS, sí.

Lo cierto es que no lo he configurado sobre 4.2, pero debería ser relativamente sencillo. Tienes algunos ejemplos sobre otras versiones en:

GitHub - covolution/enablecors: Enables Cors support for an Alfresco repository 

GitHub - LuisSala/Alfresco-CORS-AMP 

Yo suelo realizar esta configuración en Apache HTTPd, ya que basta con incluir una línea similar a la siguiente

Header set Access-Control-Allow-Origin "*"

Aunque no sé si será posible en vuestro caso.

Hyland Developer Evangelist
angelborroy
Alfresco Employee

Re: Utilizar la api login REST para obtener un ticket

Debería poder resolverse de una manera sencilla, ya que CMIS (creo que también para la 4.2) soporta JSONP

Para ello, se utiliza el parámetro callback:

localhost:8080/alfresco/cmisbrowser?callback=getResponse

En esa función JavaScript "getResponse" es donde deberíais incluir el código que ahora tenéis en 

$.getJSON('http://ipserver/ /alfresco/cmisbrowser', function (data) {

...
}

Hyland Developer Evangelist
magarcia_sm
Active Member II

Re: Utilizar la api login REST para obtener un ticket

Hola Angel, muchas gracias, me parece que estamos ahí ahí.... cerca

Te comento un poco a modo resumen que he hecho aplicando lo que nos comentas

Todas las pruebas que he hecho hasta ahora me dan un problema de CORS: "Solicitud desde otro origen bloqueada: la política de mismo origen impide leer el recurso remoto en http://mialfresco/service/api/login?u=miusuario&pw=mipassword (razón: falta la cabecera CORS 'Access-Control-Allow-Origin')."

He habilitado el filtro de CORS en el WEBINF/web.xml de alfresco tal y como habíamos comentado antes pero sigo sin lograrlo

La única forma en la que he conseguido saltarme el problema del CORS es haciendo la llamada ajax con el datatype jsonp, pero como en la respuesta espera los datos de tipo jsonp pues da un error de tipo "Uncaught SyntaxError: Unexpected token <" porque lo que encuentra es el ticket en un fichero en formato xml. Sin embargo la respuesta con ese tipo de llamada nos devuelve un 200 con statusText: "success"

Pero en ese error en su descripción encontramos el ticket.... pero no soy capaz de sacarlo :-(

Esta es la llamada que hacemos con jsonp:

$.ajax({
        async: 'true',
        url: 'http://mialfresco/service/api/login?u=miusuario&pw=mipassword',
        type: 'GET',
        dataType: 'jsonp',
        crossDomain: true,
        dataFilter: function (data, type) {
            console.log('dataFilter: ' + data);
            console.log('dataFilter: ' + type);
            return data;
        },
        complete: function (data) {
            console.log(data);
        },
        jsonp: false,
        jsonpCallback: function (data) {
            console.log('JsonpCallback: ' + data)
        });

Y estas son dos llamadas que pensamos deberían funcionar sin el problema del CORS

var settings = {
        async: true,
        beforeSend: function (xhr) {
            xhr.setRequestHeader('Access-Control-Allow-Origin', '*');
        },
        crossDomain: true,
        url: 'http://mialfresco/service/api/login?u=miusuario&pw=mipassword',
        method: 'POST',
        headers: {
            'cache-control': 'no-cache'
        }
    };
$.ajax(settings).done(function (response) {
    console.log(response);
})

la otra llamada que hemos probado:

jQuery.support.cors = true;
var urlTicket = 'http://mialfresco/service/api/login?u=miusuario&pw=mipassword';
var ticket = "";

$.get(urlTicket, function (data, status) {
    ticket = data.toString().substring(48, 95);
        window.location.href = "http://mialfresco/service/showContent?ticket=" + ticket;
}, 'html');

Hemos probado tanto con GET como con POST y el resultado es el mismo.

Lo que nos comentas de utilizar el cmisbrowser con la llamada

localhost:8080/alfresco/cmisbrowser?callback=getResponse

lo que sucede es que no podemos utilizarla por que nos pide el login y password por UI, y eso es justo lo que queremos evitar.

No se si te he entendido bien, o si lo que he hecho te parece que puede estar ok. Como te decía con la primera llamada creo que estoy cerca pues el error devuelve el ticket..... pero no sé como extraerlo pues viene en un error.

Ya me comentas que te parece a ti si tienes un minuto.

Muchas gracias!

angelborroy
Alfresco Employee

Re: Utilizar la api login REST para obtener un ticket

Buenas,

He estado revisando todo este post. No sé si no estamos liando un poco el tema. En el punto actual, creo que tu problema es que el servicio de login no soporta JSONP, por lo que no invoca a tu función de callback sino que "navega" a la página que devuelve el servicio (el ticket en formato JSON).

No obstante, he probado el siguiente código:

<html>

<head>
<script type = "text/javascript"
src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>

<script type = "text/javascript" language = "javascript">

$(document).ready(function() {
var surl = "http://localhost:8080/alfresco/service/api/login.json?u=admin&pw=keensoft";
$.ajax({
url: surl,
dataType: "json",
success: function (data) {
alert(JSON.stringify(data));
}
});
});

</script>
</head>

<body>
</body>

</html>

Y no presenta problemas de CORS, funciona sin problemas.

¿No funciona esta página HTML que he incluido en vuestro entorno?

Hyland Developer Evangelist
magarcia_sm
Active Member II

Re: Utilizar la api login REST para obtener un ticket

Buenas, 

Hemos probado la página pero nos devuelve lo mismo

XMLHttpRequest cannot load http://55.55.55.55:8080/delagro/service/api/login.json?u=xxxx&pw=xxxx. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:63342' is therefore not allowed access.