编写php应用程序实现摘要式身份验证的方法详解


Posted in PHP onJune 08, 2013

通基本身份认证一样,也可以使用PHP网页处理HTTP请求报头字段来匹配摘要式身份验证信息。例如下边的代码使用header()函数要求客户端使用Digest验证,它在HTTP消息报头中增加了一个WWW-Authenticate字段:
header('WWW-Authenticate:Digest Realm="MyRealm",nonce="47alf7cf25ce7",algorithm=MD5,qop="auth"');
--------------------------------------------------------------------------------
下边代码描述的是一个使用摘要式身份验证的网页(首先取消Apache验证配置)。

<?php
$realm="MyRealm";
//如果没有验证信息,则发送报头要求浏览器使用摘要式身份验证
if(!isset($_SERVER['PHP_AUTH_DIGEST'])){
 header("WWW-Authenticate:Digest Realm=/"$realm/",nonce=/"".uniqid()."/",algorithm=MD5,qop=/"auth/"");
 header("HTTP/1.0 401 Unauthorization Required");
 echo "账号/密码错误!";
 exit;
}else{
 //使用函数http_digest_parse解析验证信息
 $data=http_digest_parse($_SERVER["PHP_AUTH_DIGEST"]);
 if(!$data){
  header("HTTP/1.0 401 Unauthorization Required");
  echo "账号/密码错误!";
  exit;
  }else{
   //根据HTTP协议,自己构建一个response值
   $A1=md5('admin:'.$realm.':password');
   $A2=md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']);
   $valid_response=
   md5($A1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2);}
   //将自己构建的response值与浏览器构建并发送过来的response值对比,如果相同那么就证明用户名和密码输入是正确的
   if($data['response']==$valid_response){
    echo "验证通过!";
   }else{
    header("HTTP/1.0 401 Unauthorization Required");
    echo("账号/密码错误!");
    exit;
   }
  }
function http_digest_parse($digest_str){
 $needed_parts=array('nonce'=>1,'nc'=>1,'cnonce'=>1,'qop'=>1,'username'=>1,'uri'=>1,'response'=>1);
 //使用正则表达式解析Authorization报头的内容
 preg_match_all('@(/w+)=([/'"]?)([a-zA-Z0-9=.//_-]+)/2@',$digest_str,$result,PREG_SET_ORDER);
 //将结果填充$data数组,并返回
 $data=array();
 foreach($result as $m){
  $data[$m[1]]=$m[3];
  unset($needed_parts[$m[1]]);
 }
 return $needed_parts?false:$data;
}
?>

PHP 相关文章推荐
二招解决php乱码问题
Mar 25 PHP
php array的学习笔记
May 16 PHP
浅析php fwrite写入txt文件的时候用 \r\n不能换行的问题
Aug 06 PHP
ThinkPHP登录功能的实现方法
Aug 20 PHP
php查看当前Session的ID实例
Mar 16 PHP
初识ThinkPHP控制器
Apr 07 PHP
Yii实现简单分页的方法
Apr 29 PHP
php+flash+jQuery多图片上传源码分享
Jul 27 PHP
PHP简单获取网站百度搜索和搜狗搜索收录量的方法
Aug 23 PHP
php实现页面纯静态的实例代码
Jun 21 PHP
让Laravel API永远返回JSON格式响应的方法示例
Sep 05 PHP
基于Laravel 多个中间件的执行顺序详解
Oct 21 PHP
探讨方法的重写(覆载)详解
Jun 08 #PHP
php类常量的使用详解
Jun 08 #PHP
深入分析php中接口与抽象类的区别
Jun 08 #PHP
探讨PHP中this,self,parent的区别详解
Jun 08 #PHP
深入php self与$this的详解
Jun 08 #PHP
探讨如何使用SimpleXML函数来加载和解析XML文档
Jun 07 #PHP
解析dedeCMS验证码的实现代码
Jun 07 #PHP
You might like
PHP实现微信公众平台音乐点播
2014/03/20 PHP
php将文件夹打包成zip文件的简单实现方法
2016/10/04 PHP
通用JS事件写法实现代码
2009/01/07 Javascript
对javascript的一点点认识总结《javascript高级程序设计》读书笔记
2011/11/30 Javascript
js 通过html()及text()方法获取并设置p标签的显示值
2014/05/14 Javascript
JavaScript中的对象序列化介绍
2014/12/30 Javascript
Javascript中innerHTML用法实例分析
2015/01/12 Javascript
js实现拖拽效果
2015/02/12 Javascript
JavaScript面向对象的实现方法小结
2015/04/14 Javascript
jQuery背景插件backstretch使用指南
2015/04/21 Javascript
JS与jQuery遍历Table所有单元格内容的方法
2015/12/07 Javascript
详解js中构造流程图的核心技术JsPlumb(2)
2015/12/08 Javascript
使用jquery获取url以及jquery获取url参数的实现方法
2016/05/25 Javascript
jQuery分页插件jquery.pagination.js使用方法解析
2017/02/09 Javascript
JS实现图片点击后出现模态框效果
2017/05/03 Javascript
JavaScript你不知道的一些数组方法
2017/08/18 Javascript
轻松玩转BootstrapTable(后端使用SpringMVC+Hibernate)
2017/09/06 Javascript
浅析前端路由简介以及vue-router实现原理
2018/06/01 Javascript
vue  directive定义全局和局部指令及指令简写
2018/11/20 Javascript
解决layui中onchange失效以及form动态渲染失效的问题
2019/09/27 Javascript
基于javascript处理nginx请求过程详解
2020/07/07 Javascript
Vue之封装公用变量以及实现方式
2020/07/31 Javascript
封装Vue Element的table表格组件的示例详解
2020/08/19 Javascript
Python实现去除代码前行号的方法
2015/03/10 Python
Python中datetime常用时间处理方法
2015/06/15 Python
Python实现拷贝/删除文件夹的方法详解
2018/08/29 Python
python使用knn实现特征向量分类
2018/12/26 Python
Opencv实现抠图背景图替换功能
2019/05/21 Python
django基于存储在前端的token用户认证解析
2019/08/06 Python
pycharm 安装JPype的教程
2019/08/08 Python
Django跨域请求原理及实现代码
2020/11/14 Python
交通局领导班子群众路线教育实践活动对照检查材料思想汇报
2014/10/09 职场文书
党员理论学习心得体会
2016/01/21 职场文书
什么是执行力?9个故事告诉您:成功绝非偶然!
2019/07/05 职场文书
Pytorch中Softmax与LogSigmoid的对比分析
2021/06/05 Python