繁体   English   中英

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

[英]How can I share SESSION between front and backend PHP?

我对松散耦合的方法有点陌生,但我正在尝试一下。 我有一个 PHP 后端文件,它接收并响应来自前端的请求。 The problem is that the frontend is located at https://servername.com and the backend is http://localhost/backend.php

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

我目前正在使用 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)

等等我关闭它,返回等等,但这永远不会奏效。 每次我发送 session id 并尝试在后端恢复它时,传输超时。

根据我正在阅读的所有内容,恢复应该不难:

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

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

NOTE: I have tried changing the CURL url to https://localhost and servername with HTTPS but then I get an error: requested domain name does not match the server's certificate. 在没有 HTTPS 的情况下尝试 servername 会出现与我开始时相同的超时问题。

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

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

有2个解决方案;

  1. 最简单的解决方案是确保后端和前端位于同一域中(因此 www.example.com 和 backend.example.com)。 您可以将 session cookie 的cookie 域设置为.example.com ,因此两者都将使用相同的 session id。

  2. 或者,客户端需要通过浏览器将后端的 session id 发送到前端。 Jasny SSO库就是这样做的。

SSO 工作流程

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

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

它解释说 PHP 的 session class 可以被覆盖,以便它与正常工作完全相同,但在后端,您正在访问您的数据库。 这样,您所要做的就是将每个请求的 session_id 发送到后端并使用 session_id($the_id); 在 session_start() 之前的后端上,前端和后端都将无缝使用相同的 session (您可以按预期来回获取和设置变量)。

我所做的每一次分享 cookies、拉起相同的 session 等的尝试都失败了。 也许它可以与远程服务器一起使用,但我只是在 localhost 上模拟一个用于前端和后端分离的后端。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM