Acceder à la session APISession via une connection sso

1
0
-1

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

5 answers

1
0
-1
This one is the BEST answer!

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.

1
0
-1

merci avec un client jaas cela fonctionne merci pour votre aide

1
0
-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)

1
0
-1

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]));

Comments

Submitted by anthony.birembaut on Thu, 01/22/2015 - 17:02

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 ?

Submitted by jeremie.nataf on Thu, 01/22/2015 - 17:07

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?servi..." "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%2Fporta..." "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%2Fporta..." "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 ?

Submitted by anthony.birembaut on Thu, 01/22/2015 - 17:44

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.

1
0
-1

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.

Notifications