Bonjour,
Pour une application standalone en java, nous souhaitons accéder à l’objet javaAPiSession afin d’accéder aux différentes API via TenantAPIAccessor
ex :final ProcessAPI processAPI =TenantAPIAccessor.getProcessAPI(session);
La connection se fait par le biais d’un SSO CAS “Jasig” .
Au préalable l’application standalone est bien connecté au serveur bonita, avec les diférentes étapes initiant une connection sso : TicketGrantingTicket,ServiceTicket …
Comment recupère t’on la session dans une connection sso, celle ci est normalement recuperé via la méthode login
ex : final APISession session = loginAPI.login(user, password);
Pour ensuite interroger les autres apis java comme identity
Avez vous un exemple d’étape de connection SSO puis appels des apis
en java?
Merci
pour votre aide
Bonjour,
Le serveur CAS n’est utilisé que pour déléguer l’authentification.
La création d’une APISession via loginAPI.login(user, password) à partir des informations fournies par le serveur CAS est quand même nécessaire pour pouvoir intéragir avec l’API.
Si dans votre cas le login au moteur BPM a bien été réalisé, alors il faut s’assurer que l’APISession crée a bien été conservée.
S’il s’agit d’une application web, une manière courante de faire consiste à stoker la l’objet APISession dans la session HTTP pour pouvoir la récupérer ultérieurement (c’est ce qui est fait dans bonita BPM portal sous forme d’un attribut nommé apiSession).
Dans une application non web, il me semble qu’il est possible d’utiliser le thread local.
Merci pour votre réponse lorsque j’execute dans mon application java standalone la primitive logon
final APISession session = loginAPI.login(user, password);
Voici l’exception qui est soulevée
<org.bonitasoft.engine.platform.LoginException>[\n]“>
2015-01-22 16:02:03,419 DEBUG [org.apache.http.wire] - <<< " org.bonitasoft.engine.core.login.SLoginException: org.bonitasoft.engine.authentication.AuthenticationException: javax.security.auth.login.LoginException: Callback handler did not provide CAS ticket.[\n]”>
2015-01-22 16:02:03,419 DEBUG [org.apache.http.wire] - <<< " [\n]“>
2015-01-22 16:02:03,419 DEBUG [org.apache.http.wire] - <<< " com.bonitasoft.engine.api.impl.LoginAPIExt.login(LoginAPIExt.java:51)[\n]”>
2015-01-22 16:02:03,419 DEBUG [org.apache.http.wire] - <<< " sun.reflect.GeneratedMethodAccessor76.invoke(Unknown Source)[\n]“>
2015-01-22 16:02:03,419 DEBUG [org.apache.http.wire] - <<< " sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[\n]”>
2015-01-22 16:02:03,419 DEBUG [org.apache.http.wire] - <<< " java.lang.reflect.Method.invoke(Method.java:606)[\n]“>
2015-01-22 16:02:03,419 DEBUG [org.apache.http.wire] - <<< " org.bonitasoft.engine.api.impl.ServerAPIImpl.invokeAPI(ServerAPIImpl.java:368)[\n]”>
2015-01-22 16:02:03,419 DEBUG [org.apache.http.wire] - <<< " org.bonitasoft.engine.api.impl.ServerAPIImpl.invokeAPI(ServerAPIImpl.java:284)[\n]“>
2015-01-22 16:02:03,419 DEBUG [org.apache.http.wire] - <<< " org.bonitasoft.engine.api.impl.ServerAPIImpl.invokeMethod(ServerAPIImpl.java:128)[\n]”>
2015-01-22 16:02:03,435 DEBUG [org.apache.http.wire] - <<< " org.bonitasoft.engine.api.internal.servlet.HttpAPIServletCall.doPost(HttpAPIServletCall.java:112)[\n]“>
2015-01-22 16:02:03,435 DEBUG [org.apache.http.wire] - <<< " org.bonitasoft.engine.api.internal.servlet.HttpAPIServlet.doPost(HttpAPIServlet.java:35)[\n]”>
2015-01-22 16:02:03,435 DEBUG [org.apache.http.wire] - <<< " javax.servlet.http.HttpServlet.service(HttpServlet.java:643)[\n]“>
2015-01-22 16:02:03,435 DEBUG [org.apache.http.wire] - <<< " javax.servlet.http.HttpServlet.service(HttpServlet.java:723)[\n]”>
2015-01-22 16:02:03,435 DEBUG [org.apache.http.wire] - <<< " org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)[\n]">
2015-01-22 16:02:03,435 DEBUG [org.apache.http.wire] - <<< " org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilter
Il semblerait que le ticket de service ne soit pas positionné dans le post http en effet l’url du post est POST /bonita/serverAPI/org.bonitasoft.engine.api.LoginAPI/login
comment ajoute t’on le ticket a la requete ?
ce que je souhaiterai faire c’est ajouter a la requete http le parametre ticket
ArrayList<NameValuePair> arr = new ArrayList<NameValuePair>();
arr.add(new NameValuePair("ticket", serviceTicket));
method.setQueryString(arr.toArray(new NameValuePair[1]));
Dans les logs bonita nous observoncs cette exception java
AVERTISSEMENT: THREAD_ID=1158 | HOSTNAME=vmintranet | TENANT_ID=1 | impossible to login to {casServerUrlPrefix:https://portail.intranet.fr/cas | casServiceUrl:https://portail.intranet.fr/bonita/loginservice} due to following exception :
org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Fin prématurée du fichier.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:257)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:347)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:121)
at com.bonitasoft.engine.authentication.impl.cas.CASAuthenticatorImpl.createDOMDocumentFromResponse(CASAuthenticatorImpl.java:373)
at com.bonitasoft.engine.authentication.impl.cas.CASAuthenticatorImpl.loginToServiceViaCAS(CASAuthenticatorImpl.java:118)
at com.bonitasoft.engine.authentication.impl.cas.CASAuthenticatorImpl.authenticate(CASAuthenticatorImpl.java:97)
at com.bonitasoft.engine.authentication.impl.JAASGenericAuthenticationServiceImpl.tryToAuthenticate(JAASGenericAuthenticationServiceImpl.java:68)
at com.bonitasoft.engine.authentication.impl.JAASGenericAuthenticationServiceImpl.checkUserCredentials(JAASGenericAuthenticationServiceImpl.java:56)
at org.bonitasoft.engine.core.login.SecuredLoginServiceImpl.loginChoosingAppropriateAuthenticationService(SecuredLoginServiceImpl.java:166)
at org.bonitasoft.engine.core.login.SecuredLoginServiceImpl.login(SecuredLoginServiceImpl.java:106)
at org.bonitasoft.engine.api.impl.LoginAPIImpl$LoginAndRetrieveUser.call(LoginAPIImpl.java:178)
at org.bonitasoft.engine.api.impl.LoginAPIImpl$LoginAndRetrieveUser.call(LoginAPIImpl.java:159)
at com.bonitasoft.engine.transaction.JTATransactionServiceExt.executeInTransaction(JTATransactionServiceExt.java:55)
at org.bonitasoft.engine.api.impl.LoginAPIImpl.loginInternal(LoginAPIImpl.java:133)
at org.bonitasoft.engine.api.impl.LoginAPIImpl.loginInternal(LoginAPIImpl.java:105)
at com.bonitasoft.engine.api.impl.LoginAPIExt.login(LoginAPIExt.java:45)
at sun.reflect.GeneratedMethodAccessor76.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.bonitasoft.engine.api.impl.ServerAPIImpl.invokeAPI(ServerAPIImpl.java:368)
at org.bonitasoft.engine.api.impl.ServerAPIImpl.invokeAPI(ServerAPIImpl.java:284)
at org.bonitasoft.engine.api.impl.ServerAPIImpl.invokeMethod(ServerAPIImpl.java:128)
at org.bonitasoft.engine.api.internal.servlet.HttpAPIServletCall.doPost(HttpAPIServletCall.java:112)
at org.bonitasoft.engine.api.internal.servlet.HttpAPIServlet.doPost(HttpAPIServlet.java:35)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:643)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.bonitasoft.console.common.server.sso.filter.AuthenticationFilter.doFilter(AuthenticationFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.bonitasoft.console.security.SessionFixationValve.invoke(SessionFixationValve.java:77)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:745)
Je pense qu’il faut utiliser JAAS pour cela.
Sur la JVM sur laquelle l’appli standalone s’exécute, il faut que la propriété système java.security.auth.login.config soit settée avec le path vers le fichier jaas-standard.cfg qui contient le login module CasLoginModule (comme lorsqu’on configure le tomcat: http://documentation.bonitasoft.com/single-sign-cas-0#conf_engine_tomcat)
Il faut aussi inclure le jar cas-client-core et ses dépendences dans le classpath.
merci avec un client jaas cela fonctionne merci pour votre aide
Comme je ne sais pas comment est configuré votre SSO, je vais avoir du mal à répondre.
Avez-vous suivi cette doc : http://documentation.bonitasoft.com/product-bos-sp/single-sign-cas ?
Si vous essayez de vous connecter au portail, cela fonctionne ?
Oui le sso fonctionne correctement depuis le portail.
ex de connexion
“POST /cas-server/login?service=https%3A%2F%2Fportail.intranet.fr%2Fbonita%2Fportal%2Fhomepage HTTP/1.1” 302 20 “https://portail.intranet.citepro.cite-sciences.fr/cas-server/login?service=https%3A%2F%2Fportail.intranet.fr%2Fbonita%2Fportal%2Fhomepage” “Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0”
“GET /cas-server/serviceValidate?ticket=ST-28-5nAhRaSvogqJiFEGNf9X-cas&service=https%3A%2F%2Fportail.intranet.fr%2Fbonita%2Fportal%2Fhomepage HTTP/1.1” 200 174 “-” “Java/1.7.0_65”
[22/Jan/2015:16:57:06 +0100] “GET /bonita/portal/homepage?ticket=ST-28-5nAhRaSvogqJiFEGNf9X-cas HTTP/1.1” 302 20 “https://portail.intranet.fr/cas-server/login?service=https%3A%2F%2Fportail.intranet.fr%2Fbonita%2Fportal%2Fhomepage” “Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0”
[22/Jan/2015:16:57:06 +0100] “GET /bonita/portal/homepage HTTP/1.1” 200 1152 “https://portail.intranet.fr/cas-server/login?service=https%3A%2F%2Fportail.intranet.fr%2Fbonita%2Fportal%2Fhomepage” “Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0”
le problème est effectif pour la connection d’une appli standalone
Dans la doc documentation.bonitasoft.com/single-sign-cas-0 ?
on a bien dans la rest api le passage du paramètre “ticket”
bonita_server_url/loginservice?ticket={ST}
Comment passe t’on ce paramètre au client http qui invoque login(user,password)
est ce via l’api APITypeManager ?
de la même facon que le paramètre server.url et application.name ?
Je pense qu’il faut utiliser JAAS pour cela.
Sur la JVM sur laquelle l’appli standalone s’exécute, il faut que la propriété système java.security.auth.login.config soit settée avec le path vers le fichier jaas-standard.cfg qui contient le login module CasLoginModule (comme lorsqu’on configure le tomcat: http://documentation.bonitasoft.com/single-sign-cas-0#conf_engine_tomcat)
Il faut aussi inclure le jar cas-client-core et ses dépendences dans le classpath.