Php Tableau Tickets-POST获取退票登录表单,而不是票证ID
我看到StackOverflow周围没有太多的Tableau专家,但也许有人以前遇到过这个问题,并且知道解决方案。我完全不懂台词,所以如果这个问题是空洞的,请原谅我。提前谢谢 系统 我们设置Tableau的方式是在独立于Web服务器的服务器上。该应用程序是用PHP编写的,使用CakePHP2.2.0稳定版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生成的报告,我们使用了可信身份验证票证系统,在该系统中,客户机将获得一个带有
10.0.0.10 - webserver
10.0.0.11 - tableau
为了让客户机查看Tableau生成的报告,我们使用了可信身份验证票证系统,在该系统中,客户机将获得一个带有特定票证的URL。然后,客户机使用此票证直接向tableau服务器请求报告
例如:
<?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站点
,即使在我找到答案之前有一条空字符串一直在咬我们。