如何使用另一个应用程序维护PHP会话状态

时间:2012-04-29 21:49:06

标签: php coldfusion

目标:

维护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");
?>

3 个答案:

答案 0 :(得分:4)

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

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

这个过程看起来像这样

  1. CFHTTP到remoteFile.php
  2. 检查返回的http响应并提取远程应用程序设置的cookie
  3. 使用CFCOOKIE在用户浏览器中设置它们
  4. 在后续请求中,您需要查看应用程序发送的cookie是否存在以及是否在步骤1中使用CFTTPPARAM将它们与CFHTTP请求一起传递。可能是应用程序设置的sessionid或类似的cookie,需要发送它以维持会话。

答案 1 :(得分:0)

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

CFHTTP无法正常工作,因为它是调用PHP页面的ColdFusion服务器,而不是用户的浏览器。因此,ColdFusion服务器有会话,但用户的计算机没有。

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

因此,如果没有浏览器中的警告,那么在PHP服务器上没有SSL的情况下维护来自ColdFusion的PHP会话可能是不可能的(但是,当然,我希望被证明是错误的。)< / p>

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

然而,重点是寻找目标的另一条路径,而不是在ColdFusion应用程序的每个页面请求上维护会话。

答案 2 :(得分:0)

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