2011年9月29日 星期四

心得 PHP 使用 htacess 登入登出(authentication ) 問題

  使用 .htacess 來實作 登入登出(authentication ) ,有一個問題 ,


  •    若是想要作到切換使用者的方法,要使用一些額外的方式才能達成。
  •    使用 .htacess 登入之後 , 會吧帳號 密碼存到這些變數 PHP_AUTH_USER (帳號), PHP_AUTH_PW(密碼) ,PHP_AUTH_TYPE(認證型別) [1]
            不過若強制 更新 這些值 是不行的,無論是使用 , unset 卸載 或是 session_destroy() [2];     也都在 firefox 或 chorme 是行不通的, 原因是它們會存到自己的快取,只有關閉瀏覽器材會消失。 不過我在 IE 是也不行




  • 原本有考慮過新增一個logout 頁面 當呼叫的時候 就自動關閉網頁,不過很遺憾 只有 ie 支援 window.close(),  firefox 或 chorme  雖然也有找到關閉分頁的 javascript 語法 不過也沒找到 關閉整個瀏覽器的函式,不過想想也不 合邏輯 ,就放棄這方法


-------------------------------------------------

  因此,參考查到的資料, 大方向就是分成兩部份一是 IE 系列的瀏覽器,另一是其他 FF 和 Chrome.

  • IE 系列: 可參考[1] 的方式 , 呼叫 下面的 function , 在加上一個 變數 logout 當 logout.php 呼叫的時候存入 session.
function authenticate() {
 header('WWW-Authenticate: Basic realm="Test Authentication System"');
header('HTTP/1.0 401 Unauthorized');
 echo "You must enter a valid login ID and password to access this resource\n";
exit; }
.



  • FF 和 Chrome, 使用[1] 的方法也不行,我想原因也是存到 catch 的關係, 所以可以採用 [3] 的方式 , 使用 http://fake:fake@localhost/index.php 的方式,剛好這方始IE 也不是用這種語法... ,  不過 使用 這種方式我自己實驗的結果是每切換一個頁面就必須重新輸入一次帳號密碼,囧。 目前我想到的方式 就只好改成多一個頁面輸入帳號密碼,在傳入下面的 暫存網址  http://account:password@localhost/logoutTemp.php 。  以帳號密碼登入之後,整個網域都會用這個身份存取,在此我使用暫存網址的公用是隱藏帳號密碼, 用 javascript  : location.href= ("http://Host/index.php"); 來隱藏,不然都會出現帳號密碼。不過第一次傳輸的時候帳號密碼還是會被看到,還好目前先應用到公司內網。 



附註:可以使用
  strpos($_SERVER["HTTP_USER_AGENT"],"MSIE")
來判斷 是否為IE 瀏覽器 [4].

參考:

[1]. 章 16. 用 PHP 進行 HTTP 認証, PHP 手冊
[2]. PHP Code to Log a User Out,PHP Tutorials
[3]. .htaccess Logout,bytes > php > php questions
[4]. Something Useful,PHP

沒有留言: