簡體   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