如何在前端和后端PHP之间共享SESSION?

时间:2020-06-18 15:28:39

标签: php session

我对松耦合方法有些陌生,但是我正在尝试一下。我有一个PHP后端文件,该文件接收并响应来自前端的请求。问题在于前端位于https://servername.com,后端位于http://localhost/backend.php

我想检查后端,以确保已验证的用户正在发出请求,但是我无法弄清楚如何从前端到后端共享会话。基本上,我想知道发出请求的操作员的用户名,这样我就可以让后端按访问级别适当地生成响应。

我目前正在使用curl生成请求,如下所示:

$ch= curl_init();
curl_setopt($ch,CURLOPT_AUTOREFERER, TRUE);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(['session_id'=>session_id()]));
curl_setopt($ch, CURLOPT_URL, 'http://localhost/backend.php');
$response = curl_exec($ch)

等等我将其关闭,返回等等,但是这永远行不通。每次我发送会话ID并尝试在后端还原它时,传输都会超时。

根据我正在阅读的所有内容,恢复存储并不困难:

if ($_REQUEST['session_id'])
   session_id($_REQUEST['session_id']);
session_start();

但是它失败了。如果我没有发送会话ID,则通信正常,但是后端没有会话信息。如果我发送ID,则每次都会超时。

注意:我尝试使用HTTPS将CURL URL和服务器名更改为https://localhost,但随后出现错误:请求的域名与服务器的证书不匹配。在不使用HTTPS的情况下尝试服务器名会遇到与我开始时同样的超时问题。

2 个答案:

答案 0 :(得分:0)

前端上session_id()的值由前端确定。后端上的session_id()由后端确定。这些不匹配。

将前端的会话ID发送到后端将不会授予您访问后端用户会话的权限。您需要知道后端的会话ID,您无法在前端提取它。

有2种解决方案;

  1. 最简单的解决方案是确保后端和前端在同一域中(因此www.example.com和backend.example.com)。您可以将会话Cookie的cookie domain设置为.example.com,这样两者将使用相同的会话ID。

  2. 或者,客户端需要通过浏览器将后端的会话ID发送到前端。 Jasny SSO库执行此操作。

SSO workflow

免责声明;我是Jasny SSO的作者。

答案 1 :(得分:0)

最后,我能找到的唯一可行的方法是将PHP会话调用重定向到我的数据库。我使用了本指南:https://culttt.com/2013/02/04/how-to-save-php-sessions-to-a-database/

它说明可以重写PHP的会话类,使其工作原理与普通类完全相同,但是在后端,您正在访问数据库。这样,您要做的就是将每个请求的session_id发送到后端,并使用session_id($ the_id);在session_start()之前的后端上,前端和后端将无缝使用同一会话(您可以像预期的那样来回设置变量)。

绝对我尝试共享cookie,拉起相同会话等的每次尝试都失败了。也许它可以与远程服务器一起使用,但是我只是在后端上模拟了本地主机上的前端和后端分离。