2011-10-12 124 views
0

我試圖找到有關在Symfony項目中保護HTTP REST API的信息,但是我可以找到的所有信息都是關於使用sfGuardPlugin的信息。從我所看到的情況來看,這個插件對於web服務並不是很有用。它試圖讓用戶配置文件模型(並不總是那麼簡單)和「登錄」和「註銷」頁面,這對於無狀態的REST API顯然沒有意義。它比我所需要的要多得多,而且我還能保持簡單。Symfony REST API身份驗證無sfGuardPlugin

我想知道在哪裏實現我自己的授權方法(鬆散地基於Amazon S3的方法)。我知道我希望授權方法的實際工作,我只是不知道我可以將代碼放在我的Symfony應用程序中,以便它在每個請求處理之前運行,並且允許已批准的請求繼續,但不成功的請求會返回403.

有沒有想法?我無法想象這很難,我只是不知道從哪裏開始尋找。

+0

您要如何進行身份驗證?你打算髮送一個密鑰與每個請求? – Gerry

回答

0

將項目配置「require」和配置實例創建之間的HTTP basicAuth腳本粘貼在您的<appname> _dev.php(Symfony 1.4 = <)中。

在你的開發測試它。如果有效,請將代碼放入index.php文件(相當於<應用程序名稱> _dev.php)並推送它。

快速和骯髒,但它的作品。儘管你可能想要保護腳本中的用戶名/密碼。

例如

$realm = 'Restricted area'; 

     //user => password 
     $users = array('username' => 'password'); 

     if (empty($_SERVER['PHP_AUTH_DIGEST'])) { 
      header('HTTP/1.1 401 Unauthorized'); 
      header('WWW-Authenticate: Digest realm="'.$realm. 
        '",qop="auth",nonce="'.uniqid().'",opaque="'.md5($realm).'"'); 

      die('Text to send if user hits Cancel button'); 
     } 

    // || !isset($users[$data['username']] 

     // analyze the PHP_AUTH_DIGEST variable 
     if (!($data = http_digest_parse($_SERVER['PHP_AUTH_DIGEST'])) || !isset($users[$data['username']])) { 
      header('HTTP/1.1 401 Unauthorized'); 
      header('WWW-Authenticate: Digest realm="'.$realm. 
        '",qop="auth",nonce="'.uniqid().'",opaque="'.md5($realm).'"'); 
      die('Wrong Credentials!'); 
     } 

     // generate the valid response 
     $A1 = md5($data['username'] . ':' . $realm . ':' . $users[$data['username']]); 
     $A2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']); 
     $valid_response = md5($A1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2); 

     if ($data['response'] != $valid_response) { 
      header('HTTP/1.1 401 Unauthorized'); 
      header('WWW-Authenticate: Digest realm="'.$realm. 
        '",qop="auth",nonce="'.uniqid().'",opaque="'.md5($realm).'"'); 
      die('Wrong Credentials!'); 
     } 

// function to parse the http auth header 
function http_digest_parse($txt) 
{ 
    // protect against missing data 
    $needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1); 
    $data = array(); 
    $keys = implode('|', array_keys($needed_parts)); 

    preg_match_all('@(' . $keys . ')=(?:([\'"])([^\2]+?)\2|([^\s,]+))@', $txt, $matches, PREG_SET_ORDER); 

    foreach ($matches as $m) { 
     $data[$m[1]] = $m[3] ? $m[3] : $m[4]; 
     unset($needed_parts[$m[1]]); 
    } 

    return $needed_parts ? false : $data; 
} 

// **************************************************************************** 
// ok, valid username & password.. continue...