自定义摘要验证

时间:2011-03-18 09:01:09

标签: jquery authentication digest

  • 我已经为摘要认证制作了一个Http模块。在服务器上,对每个页面请求,此模块检查现有的“authenticate”标头。如果此标头不存在,则用户将收到401消息。
  • 在客户端,我使用jQuery插件进行摘要式身份验证。

知道我有流动的功能:

  1. 用户在两个输入字段中输入用户名和密码(不在浏览器Http Authentication提示符下)
  2. 使用jQuery我正在对服务器上的某个受保护页面进行ajax调用。此ajax调用基于Digest Http协议。这意味着我正在添加带有用户名,noncecount,clientnonce,MD5哈希密码等的身份验证标头。
  3. 然后服务器响应200消息:)
  4. 如果用户转到另一个页面,它将获得“401访问被拒绝”,因为该请求中没有身份验证标头。这就是问题所在。

    • 如果我使用标准摘要协议,那么浏览器会在每个请求中自动添加授权标头,我没有这个问题。但我正在使用这种方式,因为我没有用户在浏览器Http Authentication对话框中填写他的凭据。我们想要自定义对话框。在jQuery DigestJ插件中,标题称为“authenticate”而不是“authorization”,协议称为DigestJ而不是Digest。这样,当服务器响应401消息时,我没有得到浏览器Http Dialog用于输入凭据。我们不能使用表单身份验证。
    • 我可以使用jQuery会话插件在客户端存储用户凭据,但是如何在每个请求上修改Http头?我需要添加'authenticate'标头并插入会话中的凭据。

1 个答案:

答案 0 :(得分:1)

我正在使用基本的HTTP身份验证来从joomla组件中使用REST Web服务,而我的用户不必输入任何内容(只需要登录joomla一次)。我只是抓住已登录的用户,然后使用CURL将其发送到我的Web服务

    $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);

另一方面,您只需针对您的数据库检查$_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
}