自定义摘要身份验证

Posted

技术标签:

【中文标题】自定义摘要身份验证【英文标题】:Custom Digest Authentication 【发布时间】:2011-03-18 09:01:08 【问题描述】: 我已经制作了一个用于摘要认证的 Http 模块。在服务器上,对于页面的每个请求,此模块都会检查是否存在“身份验证”标头。如果此标头不存在,用户将收到 401 消息。 在客户端,我使用 jQuery 插件进行摘要式身份验证。

知道我有流动的功能:

    用户在两个输入域输入用户名和密码(不是在浏览器Http认证提示) 使用 jQuery,我正在对服务器上的某些受保护页面进行 ajax 调用。此 ajax 调用基于 Digest Http 协议。这意味着我正在添加带有用户名、noncecount、clientnonce、MD5 哈希密码等的身份验证标头。 然后服务器响应 200 消息:)

如果用户转到另一个页面,它将得到“401 访问被拒绝”,因为该请求中没有身份验证标头。这就是问题所在。

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

【问题讨论】:

你有没有找到这样做的好方法?我正在研究类似的问题? 【参考方案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);

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

【讨论】:

以上是关于自定义摘要身份验证的主要内容,如果未能解决你的问题,请参考以下文章

自定义表单身份验证的表单身份验证续订问题

Django,自定义身份验证登录。身份验证失败时如何显示错误消息?

Symfony2 自定义身份验证:用户登录但未通过身份验证

在 Jhipster 用户身份验证中添加自定义验证

自定义 Django Rest Framework 身份验证验证何时返回“无”

创建通过外部 API 进行身份验证的自定义身份验证提供程序?