2017-12-15 3 views
1

Ich versuche, auf einen PluginService in Content Navigator über meine Java-Anwendung zuzugreifen (Event Action Handler in FileNet P8). Die Anwendung verwendet den JAXRS-Anmeldedienst, um die security_token vom Content Navigator-Server zu empfangen. Wenn ich jedoch versuche, den PluginService aufzurufen, erhalte ich eine Antwort, dass mein Login abgelaufen ist.In Content Navigator von externer Anwendung aus anmelden

Ich bin in der Lage, die Sicherheitstoken zu erhalten, wie in diesem Codeblock beschrieben:

URL logonUrl = new URL("http://icn-host:9081/jaxrs/logon" 
    + "?userid=user" 
    + "&password=password" 
    + "&desktop=admin" 
    + "&contextPath=%2Fnavigator"); 
HttpURLConnection logonConnection = (HttpURLConnection)logonUrl.openConnection(); 
logonConnection.setRequestMethod("POST"); 
logonConnection.setRequestProperty("Content-Type", 
    "application/x-www-form-urlencoded"); 
logonConnection.setDoOutput(true); 
InputStream logonResponse = logonConnection.getInputStream(); 
String responseText = IOUtils.toString(logonResponse, "UTF-8") 
    .replaceFirst("^\\{}&&", ""); 
JSONObject responseJson = JSONObject.parse(responseText); 
return (String)responseJson.get("security_token"); 

Aber wenn ich versuche, einen anderen Antrag zu machen, bekomme ich eine Fehlermeldung:

URL requestUrl = new URL("http://icn-host:9081/plugin.do" 
    + "?plugin=myPlugin&action=myPluginService&myRequestProps=foobar"); 
HttpURLConnection requestConnection = 
    (HttpURLConnection)requestUrl.openConnection(); 
requestConnection.setRequestMethod("GET"); 
String securityToken = getSecurityToken(); // calls above code 
requestConnection.setRequestProperty("security_token", securityToken); 
equestConnection.setDoOutput(true); 
InputStream responseStream = requestConnection.getInputStream(); 
String responseText = IOUtils.toString(responseStream, "UTF-8") 
    .replaceFirst("^\\{}&&", ""); 
log.info("response was: " + responseText); 

Ich bekomme immer folgende Antwort:

{ 
    "messagesEncoded":true, 
    "errors": [ 
    { 
     "adminResponse":null, 
     "moreInformation":null, 
     "explanation":"Your session expired because of inactivity.", 
     "number":"1003", 
     "userResponse":"Log in again.", 
     "text":"Your session expired." 
    } 
    ] 
} 

Ich habe auch versucht, die Cookies zu setzen, aber keinen Erfolg.

java.net.CookieManager cookieManager = new java.net.CookieManager(); 
Map<String, List<String>> headerFields = logonConnection.getHeaderFields(); 
List<String> cookiesHeader = headerFields.get("Set-Cookie"); 
if (cookiesHeader != null) { 
    for (String cookie : cookiesHeader) { 
    cookieManager.getCookieStore().add(null, HttpCookie.parse(cookie).get(0)); 
    } 
} 

// ... 

StringBuilder cookieHeader = new StringBuilder(); 
List<HttpCookie> cookies = cookieManager.getCookieStore().getCookies(); 

for (int i = 0; i < cookies.size(); i++) { 
    if (i > 0) { 
    cookieHeader.append(";"); 
    } 

    HttpCookie cookie = cookies.get(i); 
    log.info("Cookie " + i + ": " + cookie.toString()); 
    cookieHeader.append(cookie.toString()); 
} 

requestConnection.setRequestProperty("Cookie", cookieHeader.toString()); 

Ich habe versucht, die Anfrage mit XMLHttpRequest in einem Content-Navigator-Fenster zu replizieren und es funktioniert wie erwartet:

var xhr = new XMLHttpRequest(); 
xhr.open("GET", "plugin.do" + 
    "?plugin=myPlugin" + 
    "&action=myPluginService" + 
    "&myRequestProps=foobar"); 
xhr.setRequestHeader("security_token", ecm.model.Request._security_token); 
xhr.send(); 

Antwort

2

ich vor ein paar Monaten für einen Kunden eine ähnliche Herausforderung, wo ich automatisieren musste das Installieren von Plugins und das Anwenden der Konfiguration für CI-Zwecke.

Ich entdeckte, es ist der Schlüssel, um den Desktop als der erste API-Aufruf nach der Anmeldung für die Sitzung zu erhalten "gültig" zu erhalten.

So zuerst jaxrs/logon, dann jaxrs/getDesktop, dann Ihren Dienst aufrufen.

Eine kleine Randbemerkung: Wenn Sie später Container-verwaltete Authentifizierung planen, wird der Prozess anders sein. Die Jaxrs/Logon funktioniert nicht, stattdessen liefert der Jaxrs/getDesktop das security_token.

Eine kleine Bemerkung: Wäre es nicht eine bessere Lösung, eine gemeinsame Bibliothek zu haben, die Sie beide von Ihrer Ereignisaktion als ICN-Dienst verwenden könnten?

+0

Content Navigator und FileNet auf separaten WebSphere-Instanzen installiert sind. Ist es möglich, eine gemeinsame Bibliothek zwischen ihnen zu haben? –

+0

Definitiv. ["Shared libraries"] (https://www.ibm.com/support/knowledgecenter/de/SSAW57_8.5.5/com.ibm.websphere.nd.doc/ae/tcws_sharedlib_create.html) ermöglicht es Ihnen, ein Dienstprogramm zu verknüpfen .jar zum Klassenlader von sowohl Ihrer FilenetEngine.ear als auch Ihrer Navigator.ear. –

0

Mit Shared Libraries (siehe Ivo Antwort) ist definitiv der beste Ansatz, jaxrs/getDesktop anrufen funktionierte nicht für mich. Stattdessen habe ich nur das Maven Assembly Plugin verwendet, um eine neuere Version der org.apache.httpcomponents Abhängigkeit einzubeziehen und die Anfragen mit einem HttpClient aufzurufen.

Mein letzter Code sieht etwa so aus:

CloseableHttpClient httpClient = HttpClients.custom() 
    .setDefaultCookieStore(cookieStore) 
    .setDefaultRequestConfig(requestConfig) 
    .build(); 
HttpUriRequest logonRequest = RequestBuilder.post() 
    .setUri("http://icn-host:9081/navigator/jarxrs/logon") 
    .addParameter("desktop", "admin") 
    .addParameter("contextPath", "/navigator") 
    .addParameter("userid", "icnadmin") 
    .addParameter("password", "password") 
    .build(); 
CloseableHttpResponse logonResponse = httpClient.execute(logonRequest); 
HttpEntity responseEntity = logonResponse.getEntity(); 
String responseText = EntityUtils.toString(responseEntity) 
    .replaceFirst("^\\{}&&", ""); 
JSONObject responseJson = JSONObject.parse(responseText); 
String securityToken = (String) responseJson.get("security_token"); 
HttpUriRequest request = RequestBuilder.get() 
    .setUri("http://icn-host:9081/navigator/plugin.do") 
    .addParameter("plugin", "myPlugin") 
    .addParameter("action", "myPluginService") 
    .addParameter("myRequestProps", "foobar") 
    .addHeader("security_token", securityToken) 
    .build(); 
HttpClientContext context = HttpClientContext.create(); 
CookieStore cookieStore = new BasicCookieStore(); 
context.setCookieStore(cookieStore); 
CloseableHttpResponse response = httpClient.execute(request, context); 
Verwandte Themen