编写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 作用域解析运算符(::)
Jul 27 PHP
PHP 时间日期操作实战
Aug 26 PHP
php中实现简单的ACL 完结篇
Sep 07 PHP
php面向对象 字段的声明与使用
Jun 14 PHP
php+mysql实现数据库随机重排实例
Oct 17 PHP
mysql alter table命令修改表结构实例详解
Sep 24 PHP
php arsort 数组降序排序详细介绍
Nov 17 PHP
redis查看连接数及php模拟并发创建redis连接的方法
Dec 15 PHP
Yii框架参数化查询中IN查询只能查询一个的解决方法
May 20 PHP
在Laravel5.6中使用Swoole的协程数据库查询
Jun 15 PHP
strpos() 函数判断字符串中是否包含某字符串的方法
Jan 16 PHP
Ajax+PHP实现的分类列表框功能示例
Feb 11 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
smarty半小时快速上手入门教程
2014/10/27 PHP
PHP+jQuery+Ajax实现用户登录与退出
2015/04/27 PHP
php生成图片验证码的方法
2016/04/15 PHP
AlertBox 弹出层信息提示框效果实现步骤
2010/10/11 Javascript
javascript学习笔记(十五) js间歇调用和超时调用
2012/06/20 Javascript
JavaScript中setFullYear()方法的使用详解
2015/06/11 Javascript
Javascript BOM学习小结(六)
2015/11/26 Javascript
jQuery ajax中使用confirm,确认是否删除的简单实例
2016/06/17 Javascript
一道面试题引发的对javascript类型转换的思考
2017/03/06 Javascript
bootstrap fileinput实现文件上传功能
2017/08/23 Javascript
Angular2监听页面大小变化的解决方法
2017/10/09 Javascript
vue todo-list组件发布到npm上的方法
2018/04/04 Javascript
nuxt.js 缓存实践
2018/06/25 Javascript
JavaScript实现的反序列化json字符串操作示例
2018/07/18 Javascript
小程序实现列表点赞功能
2018/11/02 Javascript
读懂CommonJS的模块加载
2019/04/19 Javascript
jQuery实现简易QQ聊天框
2020/02/10 jQuery
[36:33]Ti4 循环赛第四日 附加赛NEWBEE vs Mouz
2014/07/13 DOTA
Python HTMLParser模块解析html获取url实例
2015/04/08 Python
关于python之字典的嵌套,递归调用方法
2019/01/21 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
2019/10/28 Python
Python进程间通信multiprocess代码实例
2020/03/18 Python
Pyqt5 关于流式布局和滚动条的综合使用示例代码
2020/03/24 Python
Python批量处理csv并保存过程解析
2020/05/16 Python
python安装读取grib库总结(推荐)
2020/06/24 Python
Keras搭建自编码器操作
2020/07/03 Python
Python 添加文件注释和函数注释操作
2020/08/09 Python
Python colormap库的安装和使用详情
2020/10/06 Python
CSS伪类与CSS伪元素的区别及由来具体说明
2012/12/07 HTML / CSS
基于HTML5 的人脸识别活体认证的实现方法
2016/06/22 HTML / CSS
GoPro摄像机美国官网:美国运动相机厂商
2018/07/03 全球购物
信息学院毕业生自荐信范文
2014/03/04 职场文书
员工自我评价范文
2015/03/11 职场文书
2015年小学数学教研组工作总结
2015/05/21 职场文书
SpringBoot整合JWT的入门指南
2021/06/29 Java/Android
Python中可变和不可变对象的深入讲解
2021/08/02 Python