2013-07-01 54 views
0

我們試圖使用Ajax從Tableau Server獲取可信票證。 Tableau團隊提供對php,java,sharepoint,ruby的支持,但不支持Ajax。使用AJAX生成可信票證

我們正在努力的代碼是:

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

爲了給你一個想法,請在下面找到它是如何工作在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> 

任何想法如何這個PHP可以在JavaScript和AJAX工作? 任何想法我們如何改進我們的代碼?

感謝,加布裏埃爾

回答

3

加布裏埃爾 - 由於對經濟表軟件論壇的帖子提醒,你不想問問僅使用(客戶端)的JavaScript/AJAX信任的票。這樣做會給您帶來很多麻煩,實質上是打開Tableau Server,以便任何人都可以爲其他人請求票據。實施這種方式,你很快就會失去工作:)

你可以使用AJAX來調用服務器端的PHP函數,即使這樣做是一種混亂。但是,由於該頁面將存在於您信任的單個服務器上,因此您很安全。

這裏是你的代碼可能是什麼樣子:

首先,修改tableau_trusted.php,添加功能或兩個:

function generateTicket() 
{ 

     $ticket= get_trusted_ticket_direct($_POST['server'], $_POST['user'], $_POST['targetsite']); 
     echo $ticket; 

} 

if ($_POST['toDo'] == 'generateTicket') { 
    generateTicket(); 
} 

這裏是你會如何調用頁面:

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

我猜你正試圖重新使用Tableau示例中的一個與編寫自己的代碼,這很好。但是,你爲自己完成的體操比爲簡單的網絡服務(或者Windows服務,或者其他)爲你做這項工作,然後從你的門戶頁面調用它更麻煩。無論如何,這將是一個更清潔的設計模式。

祝你好運!

+0

謝謝!我們遵循了關於AJAX的消息,並稱它是一個重要的PHP功能,並且自去年以來運行良好。抱歉,延遲迴答。 – bbi