2011-03-18 146 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 
}