Php Tableau Tickets-POST获取退票登录表单,而不是票证ID

Php Tableau Tickets-POST获取退票登录表单,而不是票证ID,php,cakephp,tableau-api,Php,Cakephp,Tableau Api,我看到StackOverflow周围没有太多的Tableau专家,但也许有人以前遇到过这个问题,并且知道解决方案。我完全不懂台词,所以如果这个问题是空洞的,请原谅我。提前谢谢 系统 我们设置Tableau的方式是在独立于Web服务器的服务器上。该应用程序是用PHP编写的,使用CakePHP2.2.0稳定版 10.0.0.10 - webserver 10.0.0.11 - tableau 为了让客户机查看Tableau生成的报告,我们使用了可信身份验证票证系统,在该系统中,客户机将获得一个带有

我看到StackOverflow周围没有太多的Tableau专家,但也许有人以前遇到过这个问题,并且知道解决方案。我完全不懂台词,所以如果这个问题是空洞的,请原谅我。提前谢谢

系统

我们设置Tableau的方式是在独立于Web服务器的服务器上。该应用程序是用PHP编写的,使用CakePHP2.2.0稳定版

10.0.0.10 - webserver
10.0.0.11 - tableau
为了让客户机查看Tableau生成的报告,我们使用了可信身份验证票证系统,在该系统中,客户机将获得一个带有特定票证的URL。然后,客户机使用此票证直接向tableau服务器请求报告

例如:

  • 客户端获取-内部为10.0.0.10
  • 服务器发布到10.0.0.11,并要求客户端提供一个票证以查看报表3
  • Tableau服务器用一个数字响应帖子,例如987654321
  • 服务器用页面(包括票证)响应客户端的GET
  • 客户得到
  • Tableau服务器根据票据验证客户机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;
        }
    }
    

    我要做的第一件事是确保可信票务在真空中工作。此链接
    将使您进入一个文件夹,其中包含一个简单的HTML/JavaScript页面,您可以使用该页面确保所有内容都正确配置。然后,更仔细地查看您的代码

    为target_site提供一个值(甚至是一个零长度的字符串)是必要的,因为它告诉我们您正在为哪个Tableau站点请求票证。空白/零长度字符串=“默认站点”,本质上是

    我对PHP知之甚少,但Tableau提供了一些我过去使用过的示例代码。它不使用
    file\u get\u contents()
    来做文章,而是依靠
    http\u parse\u 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()更好的方法(也许有人可以对此发表评论),但示例代码是可靠的,只是它仍然没有包含对目标_站点参数的引用(因为它是在Tableau拥有多租户之前编写的)

    示例代码可以在C:\ProgramFiles(x86)\Tableau\Tableau Server\7.0\extras\embedding\php中找到


    祝你好运

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

    谢谢!根据您的回复,我们更仔细地查看了target_站点,结果发现我们将错误的目标站点传递到了应用程序中。我们叫它名字(“reportgen”),Tableau想要它的ID(“rg”)。也许这会帮助将来有同样问题的人:)谢谢!需要
    target\u站点
    ,即使在我找到答案之前有一条空字符串一直在咬我们。