duan5731 2013-07-01 22:51
浏览 272
已采纳

使用AJAX生成tableau受信任票证

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

  • 写回答

1条回答 默认 最新

  • duannuo4620 2013-07-04 11:51
    关注

    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!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗
  • ¥15 钢筋实图交点识别,机器视觉代码
  • ¥15 如何在Linux系统中,但是在window系统上idea里面可以正常运行?(相关搜索:jar包)
  • ¥50 400g qsfp 光模块iphy方案
  • ¥15 两块ADC0804用proteus仿真时,出现异常
  • ¥15 关于风控系统,如何去选择