自定义摘要认证

5
  • 我已经为摘要认证制作了一个 Http 模块。在服务器上,每次请求页面时,此模块都会检查“authenticate”头是否存在。如果此头不存在,则用户将收到 401 消息。
  • 在客户端,我使用 jQuery 插件进行摘要认证。

目前,我拥有以下功能:

  1. 用户在两个输入框中输入用户名和密码(而不是在浏览器 Http 认证提示中)
  2. 使用 jQuery,我对服务器上的某些受保护页面进行基于 Digest Http 协议的 ajax 调用。这意味着我添加了包含用户名、noncecount、clientnonce、MD5 哈希密码等的 authenticate 头。
  3. 然后服务器响应 200 消息 :)

如果用户转到另一个页面,则会收到“401 access denied”,因为该请求中没有 authenticate 头。这就是问题所在。

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

2
你有没有找到一个好的解决方法?我也在看类似的问题。 - BillMan
1个回答

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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接