3

目标:

维护 PHP 应用程序和 Coldfusion 应用程序之间的会话状态,它们一起构成了整个应用程序。

当前方法:

登录到我们的 Coldfusion 应用程序后(登录的唯一方式,即无法通过 PHP 应用程序登录),我们使用以下 JS 片段调用远程 PHP 文件,该文件设置 PHP 会话 cookie(无法通过 Coldfusion 设置) ,并在随后的 Coldfusion 页面访问中刷新 PHP 会话:

<script type="text/javascript">
  // Create an image.
  var imgPing = new Image();
  // Set image src to App A ping url.
  imgPing.src = "http://remotePHPApplicationURL/remoteFile.php";
</script>

登录时,此代码段会加载到每个 Coldfusion 页面上,以维护并行会话。

如果通过非 SSL Coldfusion 页面调用此方法,则该方法按设计工作,但是,有一些 SSL Coldfusion 页面包含该应用程序。当 SSL 页面调用此代码段时,我们会在 Chrome Inspector 中同时收到“不安全内容”警告(中断我们的 SSL 连接)和“匿名功能”错误。

我们已经尝试 CFHTTP 来“获取”这个 PHP 文件,但它没有按照设计设置 PHP cookie。关于如何使用 img.src 执行 PHP 文件与使用 CFHTTP 相比,我有一些不明白的地方。

问题:

是否有另一种更好的方法来调用/执行/ping PHP 文件与处理 img.src 似乎只在非 SSL 情况下有效?

以下是 PHP 文件的示例:

<?php
  error_reporting(E_ALL & ~E_NOTICE);
  define('THIS_SCRIPT', 'index');
  define('CSRF_PROTECTION', true);

  $globaltemplates = array();       

  require_once('./global.php');

  $phpapp->session->save();
  setcookie('userid', 'uid');
  setcookie('password', 'pass');
  header("Content-Type: image/png");
?>
4

3 回答 3

4

您可以使用 CFHTTP,但您必须像浏览器和远程应用程序之间的代理一样使用它,并手动管理发送和接收的 cookie。

我已经成功地将用户从 ColdFusion 登录到 phpBB

这个过程看起来像这样

  1. CFHTTP 到 remoteFile.php
  2. 检查返回的 http 响应并提取远程应用程序设置的 cookie
  3. 使用 CFCOOKIE 在用户浏览器中设置它们

在后续请求中,您需要查看应用程序发送的 cookie 是否存在,以及它们是否在步骤 1 中使用 CFTTPPARAM 与 CFHTTP 请求一起传递。应用程序可能设置了 sessionid 或类似的 cookie,需要发送该 cookie 来维护会话。

于 2012-04-30T07:25:55.400 回答
0

希望我错了,但我想不出解决办法。但是,我确实对为什么难以找到解决方案有一些见解,希望会有所帮助。

CFHTTP 不起作用,因为调用 PHP 页面的是 ColdFusion 服务器,而不是用户的浏览器。所以,ColdFusion 服务器有一个会话,但用户的计算机没有。

有很多方法可以从浏览器中调用文件(您可以从 IMG 标签、CFSCRIPT 标签、IFRAME、图像对象......),但它们都遇到相同的问题 - 即浏览器如果您从 SSL 页面调用非 SSL 文件,将发出警告。

因此,如果没有浏览器中的警告,可能无法通过 SSL 跨 SSL 维护来自 ColdFusion 的 PHP 会话(当然,我很乐意证明这一点是错误的)。

根据您的需要,可行的方法是使从您的服务器到 PHP 服务器的任何链接向 PHP 服务器发送一个包含登录信息的表单帖子,以便他们在访问该第三方站点时自动登录。我不知道这是否适合你的情况,但我想我会把它扔在那里。

然而,主要的一点是,除了在您的 ColdFusion 应用程序的每个页面请求上维护会话之外,还要寻找其他途径来实现您的目标。

于 2012-04-30T03:56:19.870 回答
0

我建议使用SAML SSO 实现并仅在需要时对特定应用程序进行身份验证,您可以使用数据库将简单会话信息交叉存储为 json 字符串。如果实施得当,体验将是无缝的,并将提供可扩展的解决方案。

于 2012-04-30T18:20:54.790 回答