11-15-2016 01:16 PM
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?
11-15-2016 01:40 PM
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.
11-15-2016 01:53 PM
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.
11-16-2016 05:30 AM
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!!
11-16-2016 05:40 AM
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
11-16-2016 07:18 AM
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.
11-16-2016 07:28 AM
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) {
...
}
11-17-2016 04:58 AM
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!
11-17-2016 06:07 AM
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?
11-17-2016 10:07 AM
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.
Tags
Find what you came for
We want to make your experience in Hyland Connect as valuable as possible, so we put together some helpful links.