5

我看到 StackOverflow 周围没有多少 Tableau 专家,但也许有人以前遇到过这个问题,并且知道解决方案。我是 Tableau 的菜鸟,所以如果这个问题是空洞的,请原谅我。提前致谢!

系统

我们设置 Tableau 的方式是在与 Web 服务器分开的服务器上。该应用程序是用 PHP 编写的,使用稳定版 CakePHP 2.2.0。

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. 服务器 POST 到 10.0.0.11,并要求客户端查看报告 3 的票证
  3. Tableau Server 使用一个数字(例如 987654321)回复帖子。
  4. 服务器使用页面响应客户端的 GET,包括票证。
  5. 客户端获取http://tableau.example.com/trusted/987654321/view3
  6. Tableau Server 根据票证验证客户端 IP,并使用报告的 HTML 进行响应。

问题

问题是这样的:当代码要求提供 tableau 票号(上面的步骤 2 和 3)时,Tableau 服务器会响应身份验证页面,而不是票证 ID。如果我注释掉 $postdata 数组中的“target_site”参数,tableau 不会以登录页面响应,而是简单地说“-1”。

生成可信 URL 的 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 的菜鸟 :)

返回的登录 html 的图像,使用转储到页面print_r('ticket')

tableau auth 登录页面转储

谢谢!

4

2 回答 2

5

我要做的第一件事是确保 Trusted Ticketing 在真空中运行。此链接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;
} 

老实说,我不知道在 PHP 社区中 file_get_contents() 是否被视为比 http_parse_message() 更好的方法(也许有人可以对此发表评论),但示例代码是可靠的,除了它仍然没有' t 包括对 target_site 参数的引用(因为它是在 Tableau 具有多租户之前编写的)。

示例代码位于 C:\Program Files (x86)\Tableau\Tableau Server\7.0\extras\embedding\php

祝你好运!

于 2012-07-06T11:05:56.860 回答
2

您必须使用站点 ID 而不是“名称”。还要注意站点名称和 ID 不是同一个字符串,因为这会导致返回 html 页面;确保您的站点名称和 ID 不同!

于 2013-02-27T19:08:44.533 回答