2012-07-06 56 views
4

我看到在TableOverflow中没有太多Tableau专家,但也许有人在那之前就有过这个问题,并且知道解决方案。我是Tableau的总厨师,所以如果这个问题真的存在,请原谅我。提前致谢!Tableau门票 - POST获取门票返回登录表单,而不是门票ID

的系统

我们的Tableau设立的方式是从Web服务器独立的服务器上。该应用程序使用CakePHP 2.2.0稳定版以PHP编写。

10.0.0.10 - webserver 
10.0.0.11 - tableau 

为了有一个客户端查看由的Tableau生成的报告中,我们使用的是可信认证售票系统,其中客户端发出的URL与特定的票。客户端然后使用此故障单直接询问Tableau服务器以获取报告。

一个例子:

  1. 客户端获得http://example.com/reports/view/3 - 这是10.0.0.10内部。
  2. 服务器员额10.0.0.11,并要求客户端的门票观点报3
  3. 的Tableau服务器响应后以数字,例如987654321.
  4. 服务器响应客户端的GET与页面,包括票证。
  5. 客户端GETS http://tableau.example.com/trusted/987654321/view3
  6. Tableau服务器根据故障单验证客户端IP,并使用报告的HTML进行响应。

的问题

问题是这样的:当代码请求的画面票号(步骤2 & 3的上方),画面服务器与认证页面,而不是一个票据ID响应。如果我在$ postdata数组中注释掉“target_site”参数,那么tableau不会响应登录页面,而只是说“-1”。

的PHP代码生成信任网址:

<?php 
public function get_trusted_url($view = 'book2sheet1') { 
    $email = $this->Auth->user(); 
    $email = $email['Email']; //This email is registered as a Tableau user! 

    $postdata = http_build_query(
     array(
      'username' => $email, 
      'target_site' => 'oursite', //If I comment this line out, Tableau no longer returns an auth page and instead simply returns "-1" 
      'client_ip' => $_SERVER['REMOTE_ADDR'] 
     ) 
    ); 

    $opts = array('http' => 
     array(
      'method' => 'POST', 
      'header' => 'Content-type: application/x-www-form-urlencoded', 
      'content' => $postdata 
     ) 
    ); 

    $context = stream_context_create($opts); 

    $ticket = file_get_contents('http://10.0.0.11/trusted/', false, $context); 
    if($ticket > 0) { 
     return 'http://tableau.example.com/t/rg/trusted/' . $ticket . '/' .$view . '?:embed=yes&:comments=no&:toolbar=yes'; 
    } else { 
     echo 'failure'; //debug 
     print_r($ticket); //debug - this prints out the auth page 
     return false; 
    } 
} 

任何帮助将不胜感激!正如我所说,我是一个总的小白在的Tableau :)使用print_r('ticket')

tableau auth login page dump

谢谢

图片返回登录的HTML,转储到新的一页!

回答

3

我会做的第一件事就是确保受信任票务在真空中工作。此链接http://ttrequest.notlong.com 会将您置于包含简单HTML/JavaScript页面的文件夹中,您可以使用该页面确保所有内容都已正确配置。然后,仔细查看你的代码。

为target_site提供一个值(即使是零长度的字符串)也是必要的,因为它告诉我们您要为其申请哪张Tableau站点。空白/零长度字符串=“默认站点”,本质上。

我知道PHP很少,但Tableau提供了一些我以前使用过的示例代码。它不使用file_get_contents()做POST,而是斜靠在http_parse_message() ...和它的作品对我来说:

Function get_trusted_ticket_direct($server, $user, $targetsite) { 

    $remote_addr = $_SERVER['REMOTE+ADDR']; 
    $params = array(
    'username' => $user, 
    'client_ip' => $remote_addr, 
    'target_site' => $targetsite 
    ); 

    $ticket= http_parse_message(http_post_fields("http://$server/trusted", $params))->body; 

    if ($ticket > 0) { 
    return $ticket; 
    } 
    else 
    return 0; 
} 

老实说,我不知道是否file_get_contents()函数被看作是一个“好”的办法而不是PHP社区中的http_parse_message()(也许有人可以对此进行评论),但示例代码是稳定的,除了它仍然不包含对target_site参数的引用(因为它是在Tableau具有多个-tenancy)。

的示例代码可以在C中找到:\程序文件(x86)\的Tableau \的Tableau服务器\ 7.0 \演员\嵌入\ PHP

祝你好运!

+2

谢谢! 根据您的回复,我们更仔细地查看了target_site,结果发现我们将错误的目标网站传递到了应用程序中。我们称其为名称(“reportgen”),Tableau需要其ID(“rg”)。 也许这将帮助未来的同一个问题的人:) – 2012-07-06 21:12:58

2

您必须使用网站ID而不是“名称”。同样要小心,网站名称和ID不是相同的字符串,因为这会导致返回的HTML页面;确保您的网站名称和ID不同!