2011-03-18 96 views
4
  • 我爲摘要身份驗證製作了一個Http模塊。在服務器上,每次請求頁面時,都會檢查是否存在「authenticate」標頭。如果此標題不存在,用戶將收到401消息。
  • 在客戶端,我使用jQuery插件進行摘要式身份驗證。

對於知道我有流動的功能:定製摘要身份驗證

  1. 用戶在兩個輸入字段中輸入用戶名和密碼(不是在瀏覽器中的HTTP驗證提示)
  2. 使用jQuery我正在做的Ajax調用到服務器上的一些受保護的頁面。這個ajax調用基於Digest Http協議。這意味着我將身份驗證標頭名,noncecount,clientnonce,MD5哈希密碼等
  3. 然後用200消息:)

服務器響應如果用戶轉到其他網頁就會得到「 401訪問被拒絕「,因爲該請求中沒有身份驗證標頭。這就是問題所在。

  • 如果我使用標準摘要協議,那麼瀏覽器會在每個請求中自動添加授權標頭,而我沒有這個問題。但是我正在使用這種方式,因爲我不知道用戶在瀏覽器Http Authentication對話框中填充憑據的方式。我們想要我們的自定義對話框。在jQuery DigestJ插件中,頭部被稱爲'authenticate'而不是'authorization',協議被稱爲DigestJ而不是Digest。這樣,當服務器響應401消息時,我不會讓瀏覽器的Http對話框輸入憑據。我們不能使用表單身份驗證。
  • 我可以使用jQuery會話插件在客戶端存儲用戶憑證,但是如何在每個請求上修改Http標頭?我需要添加「身份驗證」標題並從會話中插入憑據。
+2

你有沒有找到一個這樣做的好方法?我正在看類似的問題? – BillMan 2011-05-17 18:49:13

回答

1

我使用基本的HTTP身份驗證來從joomla組件中使用REST Web服務,並且我的用戶不必輸入任何內容(只需登錄joomla一次)。我只是抓住已經登錄的用戶,然後我使用curl

$ch = curl_init(); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
//$username and $pass are the vars that will be used for authentication you can get them from your session or a cookie or in my case i got them from joomla JFactory::getUser()->username and JFactory::getUser()->password 
     curl_setopt($ch, CURLOPT_USERPWD, JFactory::getUser()->username.':'.JFactory::getUser()->password); 
    //here comes the important thing 
     curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 

     curl_setopt($ch, CURLOPT_URL, $url); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
     $response=curl_exec($ch); 

另一方面它發送到我的web服務,你只需要檢查$_SERVER['PHP_AUTH_USER']$_SERVER['PHP_AUTH_PW']對你的數據庫,你就大功告成了

if (!isset($_SERVER['PHP_AUTH_USER'])||$_SERVER['PHP_AUTH_USER']==''||!isset($_SERVER['PHP_AUTH_PW'])||$_SERVER['PHP_AUTH_PW']=='') { 
    header('WWW-Authenticate: Basic realm="Something"'); 
    header('HTTP/1.0 401 Unauthorized'); 
    echo 'You must be a valid user to access this contents'; 
    exit; 
} else { 
     // go to your database check they are valid and return whatever you want to return 
}