Reputation: 5
We are trying to get a trusted ticket from Tableau Server using Ajax. Tableau team provides support for php, java, sharepoint, ruby but not for Ajax.
The code we are working is:
<script type="text/javascript" src="../js/jquery-1.7.1.min.js"></script>
<script type="text/javascript" src="../js/tableau_v8.js"></script>
<script type="text/javascript" src="jsonp.js"></script>
<script type="text/javascript">
$(document).ready(function () {
$("#tableau").each(function () {
var workbook = $(this).attr("Presents");
var view = $(this).attr("MyDashboard");
var username = $(this).attr("userx");
var ticket;
$.ajax({
type: 'POST',
url: 'http://serverurl/trusted',
contentType: 'application/json',
dataType: 'jsonp',
data: {
username:'registeredusername',
server:'url},
success: function (result) {
alert('Ok');
ticket = result;
},
error: function () {
//console.log('Erro');
alert('Error');
}
});
var url = "http://serverurl/trusted/" + ticket + "/views/" + workbook + "/" + view;
var options = {
width: this.offsetWidth,
height: this.offsetHeight,
hideTabs: true,
hideToolbar: false,
onFirstInteractive: function () {
workbook = viz.getWorkbook();
activeSheet = workbook.getActiveSheet();
}
};
viz = new tableauSoftware.Viz(this, url, options);
});
});
</script>
To give you an idea, please find below how it works in php:
TABLEAU_TRUSTED.php
<?php
// Returns a trusted URL for a view on a server for the
// given user. For example, if the URL of the view is:
// http://tabserver/views/MyWorkbook/MyView
//
// Then:
// $server = "tabserver";
// $view_url = "views/MyWorkbook/MyView";
//
function get_trusted_url($user,$server,$view_url) {
$params = ':embed=yes&:toolbar=yes';
$ticket = get_trusted_ticket($server, $user, $_SERVER['REMOTE_ADDR']);
if($ticket > 0) {
return "http://$server/trusted/$ticket/$view_url?$params";
}
else
return 0;
}
// Note that this function requires the pecl_http extension.
// See: http://pecl.php.net/package/pecl_http
// the client_ip parameter isn't necessary to send in the POST unless you have
// wgserver.extended_trusted_ip_checking enabled (it's disabled by default)
Function get_trusted_ticket($wgserver, $user, $remote_addr) {
$params = array(
'username' => $user,
'client_ip' => $remote_addr
);
return http_parse_message(http_post_fields("http://$wgserver/trusted", $params))->body;
}
?>
TABLEAU_SAMPLE_VIEW_PAGE.php
<p>An embedded view appears below:</p>
<?php
// This user-provided library should define get_user(), which returns the
// name of the user currently logged into this application.
//
include 'auth.php';
// Tableau-provided functions for doing trusted authentication
include 'tableau_trusted.php';
?>
<iframe src="<?php echo get_trusted_url(get_user(),'localhost','views/Date-Time/DateCalcs')?>"
width="400" height="400">
</iframe>
<p>
This was created using trusted authentication.
</p>
Any ideas how this php could work in javascript and ajax? Any ideas how could we improve our code?
Thanks, Gabriel
Upvotes: 0
Views: 6264
Reputation: 1707
Gabriel - As the post on the Tableau Software forums warns, you do NOT want to ask for a trusted ticket using only (client-side) JavaScript/AJAX. Doing so will get you into lots of trouble, essentially opening Tableau Server up so that anyone can request a ticket for anyone else. Implement that way, and you'll shortly be out of a job :)
You can use AJAX to call a server-side PHP function, even though doing so is kind of a kludge. However, since the page will live on a single server, trusted by you, you're safe.
Here's what your code might look like:
First, modify the tableau_trusted.php, adding a function or two:
function generateTicket()
{
$ticket= get_trusted_ticket_direct($_POST['server'], $_POST['user'], $_POST['targetsite']);
echo $ticket;
}
if ($_POST['toDo'] == 'generateTicket') {
generateTicket();
}
Here's how you might call the page:
// variables to feed trusted ticket retrieval
var phpScript = "http://someserver/tableau_trusted.php",
userName = "someuser",
serverURL = "tableauserverlocation";
// variable to hold trusted ticket
var incomingTicket;
$.post(phpScript, {
toDo: 'generateTicket',
user: userName,
server: serverURL,
targetsite: ''
}, function(response) {
// do something with response (the ticket) right here
incomingTicket = response;
});
I'm guessing you're trying to re-use one of the Tableau samples vs. writing your own code, and that's fine. BUT, the gymnastics you're putting yourself through may be more troublesome than writing a simple web service (or windows service, or whatever) to do this work for you, then calling it from your portal's page. That would be a cleaner design pattern, anyway.
Good luck!
Upvotes: 3