Authenticate and Execute FEX using single URL in MRE
I am trying to create a URL that would authenticate to MRE as well as execute a specified FEX. This is so that I can call this URL from a java app without having to maintain cookies in java. Any thoughts?
July 26, 2005, 02:23 PM
dhagen
Why not call the report via a web service (webfocus web service enablement option).
August 16, 2005, 02:19 PM
anush
Web services is not an option according to our company's WebFOCUS host. We use a shared WebFOCUS environment and for some reason they do not allow the web services option.
I did, however, manage to figure out a solution. I ended up creating a java class that is able to establish an authenticated connection using http (essentially does what we would do manually through a browser) and manages the session cookies provided by the MRE. After a connection is established, I can call upon it to execute any number of reports I want and can get the output in a number of formats.
August 17, 2005, 08:43 PM
TexasStingray
anush, can you post you java code or at lease email me a copy that. Scott_Wanner@ibi.com
August 23, 2005, 12:53 PM
anush
OK... there actually IS a way to authenticate and execute from MRE. You need to use the IBIMR_drill=RUNNID param for this to work. Here's an example:
I incorporated this into my code as well. Note that the WebFocusConnector class has 2 methods of executing reports. First method (session-less connection) uses the drill param mentioned above. This way, it does not have to maintain MRE cookies. Second method uses a session- based connection i.e. it maintains the MRE cookie. This allows you to send the user & pass just once and following that, execute as many reports as you want without having to pass credentials each and every time. Here's the code:
import java.io.IOException;
import java.io.
InputStream;import java.io.UnsupportedEncoding
Exception;i
mport java.net.URLEncoder;
import org.apache.commons.
httpclient.
Cookie; import rg.aache.commons.
httpclient.
HttpClientimport org.apache.commons.
httpclient.
HttpException; import org.
apache.commons.
httpclient.
HttpMethod; import org.apache.commons.httpclient.
HttpState;import org.apache.
commons.httpclient.
NameValuePair;
import org.apache.commons.http
client.methods.
GetMethod; import org.apache.log4j.
Logger; This class allows
for an authenticated
connection to a WebFOCUS *
Managed Reporting Environment
enabling the execution of secure *
WebFOCUS reports. * @author
Anush Ramanipublic class WebFocus
Connector static
final String SERVLET_TOKEN=
"ibi_apps/WFServlet"
static final String S
IGNON_TOKEN
= "IBIMR_action=MR_SIGNON";
static final String USERID_TOKEN=
"IBIMR_user" static final String
PASSWORD_TOKEN = "IBIMR_pass";
static final String
DOMAIN_TOKEN =
"IBIMR_domain";
static final String REPORT_TOKEN= IBIMR_action=MR_RUN_FEX&I
BIMR_sub_action=MR_STD_REPORT&
IBIMR_fex";
static final String FOLDER_
TOKEN = "IBIMR_folder";static
final String DRILL_TOKEN=
"IBIMR_drill=RUNNID"; static final
String AUTH_COOKIE = "MR_COOKIE";
static final int AUTH_SUCCESS = 0;
static final int AUTH_FAIL= -1;
static Logger log
=ogger.getLogger(WebFocus
Connector.class);Server
information private String server;
private int port; //
User credentials private String
userId; private String
password;private String
sessionBasedURL; private
String
sessionLessURL;
private HttpClient client;
private HttpMethod method;
private boolean
isConnected = false;
@param server WebFOCUS server name
(can be either IP or hostname).*
@param portWebFOCUS server's
communication port number. @param userId MRE user's login ID.@param passwordMRE user's
password. * @param establishSession
If <code>true</code>, an attempt
will be made to created an authenticated session. If <code>false</code>,
reports will be executed in a
session-less method.
public WebFocusConnector
(String server,
int port, String userId,
String password, boolean
establishSession)
this.server = server;
this.port = port;
this.userId = userId;
this.password = password;
client = new HttpClient() if(establishSession) connect();sessionBasedURL =
"http://" + server + ":" +
port + "/" + SERVLET_TOKEN + "?"; sessionLessURL =
"http://" + server + ":" + port + "/" +
SERVLET_TOKEN + "?" +
DRILL_TOKEN + "&"
+ USERID_TOKEN + "="
+ userId + &" + PASSWORD_TOKEN
+ "=" + password; Establishes an
authenticated connection to the
WebFOCUS s
erver.@return Indicates if
the connection
was successfully authenticated.
public boolean connect()
String url = "http://" +
server + ":" + port "/" +
SERVLET_TOKEN + "?" + SIGNON_TOKEN +
"&" + USERID_TOKEN + "=" +
userId + "&" + PASSWORD_TOKEN +
"=" + password;method = new
GetMethod(url); tryclient.executeMethod(method); Read the response body
byte[] responseBody = method.getResponseBody()catch
(HttpException e)
e.printStackTrace();
catch (IOException e) e.printStackTrace(); finally
Release the connection. method.releaseConnection();
return isAuthenticated();
Checks if the current
connection to the WebFOCUS
server is authenticated.
* @return Indicates if the current c
onnection has been authenticated.
public boolean isAuthenticated()
HttpState state = client.getState(); Cookie[] cookies =
state.getCookies();
loop through the array of cookies
to check if we have the MRE session
cookie for(int i = 0; i < cookies.length;
i++) if(cookies[i].getName().
equals(AUTH_COOKIE))
return true;// session
cookie was not found
return false; public void release
Connection() method.releaseConnection();
isConnected = false; * Execute's an MRE FEX stored on the WebFOCUS server. *
@param domain MRE Domain where
report is located.* @param
folder MRE Folder where report is
located. * @param name
Name of the report to
execute. * @param params
Parameters to be passed to
the report. * @retur Output
from the executed report. public InputStream executeReport(String domain,
String folder, String
report, NameValuePair[] params)
if(isConnected) releaseConnection()
String url = null;InputStream
responseBody = null;
if(isAuthenticated())
url = sessionBasedURL;
else url = sessionLessURL; t
ry // construct URL with URL-safe
(UTF8-encoded)valuesurl += "&" +
DOMAIN_TOKEN + "=" + URLEncoder.encode(domain.trim(),
"UTF-8") + "&" + FOLDER_TOKEN + "=" + URLEncoder.encode(folder.trim(),
"UTF-8") + "&" + REPORT_TOKEN + "=" + URLEncoder.encode(report.trim(),
"UTF-8");if any parameters exist, a
dd them to the URLif
(params != null)
for(int i = 0; i
<params.length; i++)if(
params[i]
!= null url += "&" L
Encoder.encode
(params[i].
getName().trim(),
"UTF-8") + "=" + URLEncoder.
encode(params[i].
getValue().trim(), "UTF-8");
catch (UnsupportedEncodingException e1) e1.printStackTrace();
method = new GetMethod(url);
try log.debug("Executing HTTP
method: " + url)
client.executeMethod
(method); responseBody = method.getResponseBodyAsStream() isConnected = true;catch
(HttpException e)
e.printStackTrace();
catch (IOException e) e.printStackTrace();
return responseBody; p
ublic
static void
main(String[] args)
WebFocusConnector conn =
new WebFocusConnector
(<server>,
<port>, <user>, <password>,
<session?>
NameValuePair[] params =
{new NameValuePair
("REP_START_DATE", "20050101"),
new NameValuePair(
"REP_END_DATE",
"20050526"), new NameValuePair
("CURRENCY_CODE", "USD"), new NameValuePair
("REP_OUTPUT", "PDF")}
InputStream responseBody =
conn.executeReport
(<domain>,
<folder>, <fex>, params);
Note that to use this code, you will require the HttpClient jar and its dependencies (available at apache.org).This message has been edited. Last edited by: <Mabel>,
August 23, 2005, 01:46 PM
Francis Mariani
IBIMR_drill=RUNNID
Thank you for this information - it may come in handy.
July 12, 2007, 05:44 PM
Nick
Thanks for the information on the IBIMR_drill=RUNNID. That was what I was missing and my self-service links were not working as I was getting the "must login to MRE" message. Just wanted to post a "thank you for contributing to the forum".
Dev- WF 7.68 on Windows Server 2003: DB2, SQL Server 2K, SQL Server 2005, SQL Server Anaysis Services 2005. Test- WF 7.67 on Windows Server 2003: DB2, SQL Server 2K, SQL Server 2005, SQL Server Anaysis Services 2005. Prod - Dev- WF 7.65 on Windows Server 2003: DB2, SQL Server 2K, SQL Server 2005, SQL Server Anaysis Services 2005
September 07, 2007, 06:29 PM
Francis Mariani
Adding &IBIMR_drill=RUNNID seems to allow one to login to MRE without a valid User ID and Password.
Is there some way to stop this?
Thanks,
Francis
Give me code, or give me retirement. In FOCUS since 1991
Production: WF 7.7.05M, Dev Studio, BID, MRE, WebSphere, DB2 / Test: WF 8.1.05M, App Studio, BI Portal, Report Caster, jQuery, HighCharts, Apache Tomcat, MS SQL Server
September 08, 2007, 03:27 PM
Francis Mariani
Further to this, it looks like you can login with anything as User ID/Password, the IBIMR_fex is executed alright, but if that program has a form that submits another report, you get the "not logged-in to MRE" message.
Francis
Give me code, or give me retirement. In FOCUS since 1991
Production: WF 7.7.05M, Dev Studio, BID, MRE, WebSphere, DB2 / Test: WF 8.1.05M, App Studio, BI Portal, Report Caster, jQuery, HighCharts, Apache Tomcat, MS SQL Server
I thought this form would be one method to login to MRE and execute a fex. Well, it appears to login and execute a fex, but if the executed fex has a form to submit another fex, I get "Cannot execute the request. Please log into Managed Reporting."
Any ideas, anyone?
Thanks.
Francis
Give me code, or give me retirement. In FOCUS since 1991
Production: WF 7.7.05M, Dev Studio, BID, MRE, WebSphere, DB2 / Test: WF 8.1.05M, App Studio, BI Portal, Report Caster, jQuery, HighCharts, Apache Tomcat, MS SQL Server
I have made his suggestion work, but I may have to add some cookie deletion JavaScript - I've noticed if I login with a different User ID, the first User ID is the one that's really logged in.
Also, I cannot find any documentation on a couple of MRE parameters he specified: SIGNON_CORRECT_ADMIN and SIGNON_CRT_DOM_ADMIN.
Francis
Give me code, or give me retirement. In FOCUS since 1991
Production: WF 7.7.05M, Dev Studio, BID, MRE, WebSphere, DB2 / Test: WF 8.1.05M, App Studio, BI Portal, Report Caster, jQuery, HighCharts, Apache Tomcat, MS SQL Server
September 20, 2007, 01:14 PM
<Jim Thorstad - WF Product Mgt.>
We are adding two new settings in WebFOCUS 7.6.4, MR_ANONYMOUS_RUN_ACCESS=YES|NO and MR_AUTOSIGNON=YES|NO. I think these will give you what you are looking for, and also address the security concerns some people have had about IBIMR_drill=RUNNID. Also, look for this being written up in the next WF Newsletter Article.