2

Java アプリケーション (FileNet P8 のイベント アクション ハンドラ) から Content Navigator の PluginService にアクセスしようとしています。アプリケーションは JAXRS ログオン サービスを使用してsecurity_token、Content Navigator サーバーから を受信します。ただし、PluginService を呼び出そうとすると、ログインの有効期限が切れているという応答が返されます。

このコード ブロックで説明されているように、セキュリティ トークンを取得できます。

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

しかし、別のリクエストをしようとすると、エラー応答が返されます。

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

私はいつも次の応答を受け取ります。

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

私もクッキーを設定しようとしましたが、成功しませんでした。

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

Content Navigator ウィンドウで XMLHttpRequest を使用してリクエストを複製しようとしましたが、期待どおりに動作します。

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();
4

2 に答える 2

5

数か月前、クライアントに対して同様の課題がありました。そこでは、プラグインをインストールし、CI 目的で構成を適用するプロセスを自動化する必要がありました。

セッションが「有効」になるには、ログイン後の最初の API 呼び出しとしてデスクトップを取得することが重要であることがわかりました。

したがって、最初に jaxrs/logon、次に jaxrs/getDesktop、次にサービスを呼び出します。

ちょっとした補足: 後でコンテナー管理認証を使用する予定がある場合は、プロセスが異なります。jaxrs/logon は機能せず、代わりに jaxrs/getDesktop が security_token を配信します。

ただし、少し注意してください: ICN サービスとしてイベント アクションから両方を使用できる共有ライブラリを用意する方が良い解決策ではないでしょうか?

于 2017-12-15T19:39:11.347 に答える