gpt4 book ai didi

php - Tableau Tickets - POST 以获取票证返回登录表单,而不是票证 ID

转载 作者:可可西里 更新时间:2023-11-01 13:55:34 34 4
gpt4 key购买 nike

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

系统

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

10.0.0.10 - webserver
10.0.0.11 - tableau

为了让客户查看 Tableau 生成的报告,我们使用了受信任的身份验证票证系统,在该系统中,客户端会收到一个带有特定票证的 URL。客户端然后使用此票证直接向画面服务器请求报告。

一个例子:

  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 服务器根据票证验证客户端 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 login page dump

谢谢!

最佳答案

我要做的第一件事是确保 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() “更好”的方法(也许有人可以对此发表评论),但示例代码是可靠的,除了它仍然不包含对 target_site 参数的引用(因为它是在 Tableau 具有 Multi-Tenancy 之前编写的)。

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

祝你好运!

关于php - Tableau Tickets - POST 以获取票证返回登录表单,而不是票证 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11354258/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com