2011-10-12 146 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...