PHP 使用session對兩個不同的伺服器網站進行同步登入

來源:互聯網
上載者:User
PHP session 跨域 登入

現在有兩個伺服器
a:www.test1.com
b:www.test2.com
我想在test1裡面進行登入,然後在test2裡面也同樣進行登入,請問這個該怎麼寫?

我有部分測試代碼如下
在test1登入的時候,如果登入成功那麼就執行下面
$fp = pfsockopen("www.test2.com",80,$errorno,$errormsh);//串連伺服器if ($fp){    $out = "GET /login.php?acc=".$acc."&psw=".$psw." HTTP/1.1\r\n";       $out.= "Host:www.test2.com\r\n";       $out.= "Connection: Close\r\n\r\n";            fputs($fp, $out);    fclose($fp);   }


然後在www.test2.com裡面的login.php檔案
$acc = $_GET['acc'];$psw = $_GET['psw'];$_SESSION['acc'] = $acc;$_SESSION['psw'] = $psw;


然後我訪問www.test2.com
發現session為空白啊
求高手指教!


回複討論(解決方案)

如果單點登入這麼容易搞得話,那些 SSO 服務商不都要倒閉了?

session 依靠 cookie 攜帶的 sessionid 做唯一性識別
而正常的 cookie 是不能跨域的。雖然利用一些技術手段可以實現 cookie 跨域,但這畢竟是利用了規則上的漏洞,並不可取。

我們知道,如果一個網站有設定了失效期的 cookie 的話,當瀏覽結束時就會在瀏覽器緩衝區留下一個以該網站網域名稱的 cookie 檔案。當再次訪問該網站時,這個上次儲存的 cookie 就會被發送回去

因此,你只要在訪問 www.test1.com 的時候,設法留下一個 www.test2.com 的 cookie 檔案
那麼你再訪問 www.test2.com 的時候就能實現同步了

怎麼留?在 www.test1.com 返回的頁面中用 iframe 或 js 訪問一下 www.test2.com 的特定檔案

當然,這隻是基礎,需要考慮的問題遠不止這點

如果單點登入這麼容易搞得話,那些 SSO 服務商不都要倒閉了?

session 依靠 cookie 攜帶的 sessionid 做唯一性識別
而正常的 cookie 是不能跨域的。雖然利用一些技術手段可以實現 cookie 跨域,但這畢竟是利用了規則上的漏洞,並不可取。

我們知道,如果一個網站有設定了失效期的 cookie 的話,當瀏覽結束時就會在瀏覽器緩衝區留下一個以該網站網域名稱的 cookie 檔案。當再次訪問該網站時,這個上次儲存的 cookie 就會被發送回去

因此,你只要在訪問 www.test1.com 的時候,設法留下一個 www.test2.com 的 cookie 檔案
那麼你再訪問 www.test2.com 的時候就能實現同步了

怎麼留?在 www.test1.com 返回的頁面中用 iframe 或 js 訪問一下 www.test2.com 的特定檔案

當然,這隻是基礎,需要考慮的問題遠不止這點
那請問老大,我這樣處理行不行
在www.test2.com裡面的login.php檔案裡面寫上建立cookie的代碼

setcookie("acc",$acc,time()+3600,'/');

這樣,是不是在我訪問www.test2.com的時候這個cookie會直接發送頁面
然後我在訪問的時候加上一個對cookie的判斷是否就行了?

只要 www.test2.com/login.php 是在 www.test1.com 返回的頁面 裡面調用的就可以
就是說你在訪問 www.test1.com 的同時也訪問了 www.test2.com
這樣 www.test1.com 的 cookie 供訪問 www.test1.com 用
www.test2.com 的 cookie 供訪問 www.test2.com 用

只要 www.test2.com/login.php 是在 www.test1.com 返回的頁面 裡面調用的就可以
就是說你在訪問 www.test1.com 的同時也訪問了 www.test2.com
這樣 www.test1.com 的 cookie 供訪問 www.test1.com 用
www.test2.com 的 cookie 供訪問 www.test2.com 用
怎麼樣才叫做在返回的頁面裡面調用?
www.test1.com裡面index.php
使用登入成功之後訪問www.test2.com的方法,這個算不算是調用了!
實際情況是這樣
www.test1.com裡面login.php裡面登入成功之後使用,

$fp = pfsockopen("www.test2.com",80,$errorno,$errormsh);//串連伺服器        if ($fp){                $out = "GET /login.php?acc=".$acc."&psw=".$psw." HTTP/1.1\r\n";                   $out.= "Host:www.test2.com\r\n";                   $out.= "Connection: Close\r\n\r\n";                         fputs($fp, $out);                fclose($fp);           }

然後後面就直接跳轉會www.test1.com裡面index.php頁面了
www.test2.com裡面login.php中就寫上了cookie
setcookie("acc",$acc,time()+3600,"/");//寫檔案,查看是否訪問以及寫入cookie成功$fp = fopen("test.txt","w");fwrite($fp,"acc:".$_COOKIE['acc']);fclose($fp);


我剛才測試了一下,發現test.txt檔案存在,裡面也有資料
然後我就去訪問www.test2.com
在頁面上加入了var_export($_COOKIE);
打出來的資料並沒有我寫入的東西,為什嗎?
這樣算不算老大你剛才說的“在 www.test1.com 返回的頁面裡面調用”

“在 www.test1.com 返回的頁面裡面調用”是指請求是從瀏覽器發出的,這樣返回的 cookie 才會被瀏覽器儲存

“在 www.test1.com 返回的頁面裡面調用”是指請求是從瀏覽器發出的,這樣返回的 cookie 才會被瀏覽器儲存

echo "";

我在登入之後是用來這樣的
別的不動,結果cookie還不沒有我寫入的資料,而且檔案都建立不出來了,是不是我太笨了?
這寫錯了?還是應該用別的方法,求老大指教!

把session單獨存入資料庫或者memcache之類的”記憶體資料庫”中,然後各個網站讀取的時候全部從session 資料庫中擷取

把session單獨存入資料庫或者memcache之類的”記憶體資料庫”中,然後各個網站讀取的時候全部從session 資料庫中擷取
簡單明了。大版有什麼高見呢。。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.