欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-25 17:31:03
通基本身份认证一样,也可以使用php网页处理http请求报头字段来匹配摘要式身份验证信息。例如下边的代码使用header()函数要求客户端使用digest验证,它在http...
通基本身份认证一样,也可以使用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;
}
?>